Как обработать огромные наборы результатов от базы данных

RGB обычно допускает значение от 0 до 255 для каждого цвета.

Обычно это означает 256 3 = 16 777 216 или около 16,8 миллионов цветовых комбинаций.

Установка синего в ноль не дает вам выбора, поэтому комбинации становятся 256 2 = 65 536 или около 65 с половиной тысяч цветовых комбинаций.

6
задан Steve Kuo 23 October 2008 в 23:25
поделиться

10 ответов

Я сказал бы, если потенциал exsists для большого набора данных, то пойдите путем подкачки страниц.

Можно все еще установить МАКСА, через которого Вы не хотите, чтобы они пробежались.

НАПРИМЕР, Так использует размеры страницы 15, 30, 50...

1
ответ дан 10 December 2019 в 00:46
поделиться

Самый первый вопрос должен быть:

Пользователь ¿The должен или способен к, управляйте этим объемом данных?

Хотя набор результатов должен быть разбит на страницы, если потенциально измеряют, так огромно, ответ будет, "вероятно, не", таким образом, UI не должен пытаться показать его.

Я работал над проектами J2EE на Системах здравоохранения, тем соглашением с огромным объемом хранивших данных, буквально миллионы пациентов, посещений, форм, и т.д., и общее правило не состоит в том, чтобы показать больше чем 100 или 200 строк ни для какого пользовательского поиска, советуя пользователю, что те, которые набор критериев производит больше информации, которую он может понять.

Способ реализовать это варьируется от одного проекта до другого, возможно вынудить UI попросить, чтобы сервис разделил размер на уровни запроса прежде, чем запустить его, или возможно выдать Исключение от сервисного уровня, если набор результатов растет слишком много (однако, этот путь связывает сервисный уровень с ограниченной реализацией UI).

Будьте осторожны! Это не означает, что каждый метод на сервисном уровне должен выдать Исключение, если его размеры результата больше чем 100, это общее правило только относится к наборам результатов, которые показывают пользователю непосредственно, который является лучшей причиной поместить управление в UI вместо этого на сервисном уровне.

6
ответ дан 10 December 2019 в 00:46
поделиться

Самый частый шаблон я видел эту ситуацию, является своего рода подкачкой страниц, обычно делавшаяся серверная сторона для сокращения объема информации, отправленного по проводу.

Вот пример SQL Server 2000 с помощью табличной переменной (обычно быстрее, чем временная таблица) вместе с уличным примером знаков:

CREATE PROCEDURE GetPagedStreetSigns
(
  @Page int = 1,
  @PageSize int = 10
)
AS
  SET NOCOUNT ON

  -- This memory-variable table will control paging
  DECLARE @TempTable TABLE (RowNumber int identity, StreetSignId int)

  INSERT INTO @TempTable
  (
     StreetSignId
  )
  SELECT [Id]
  FROM   StreetSign
  ORDER BY [Id]

  -- select only those rows belonging to the requested page
  SELECT SS.*
  FROM   StreetSign SS
         INNER JOIN @TempTable TT ON TT.StreetSignId = SS.[Id]
  WHERE  TT.RowNumber BETWEEN ((@Page - 1) * @PageSize + 1) 
                      AND (@Page * @PageSize)

В SQL Server 2005 можно стать более умными с материалом как Общие Выражения Таблицы и новые функции Рейтинга SQL. Но общая тема - то, что Вы используете сервер для возврата только информации, принадлежащей текущей странице.

Знайте, что этот подход может стать грязным, если Вы позволяете конечному пользователю применять непрерывные фильтры к данным, которые он или она видит.

2
ответ дан 10 December 2019 в 00:46
поделиться

Одна вещь опасаться при работе с классами обертки строки собственной разработки как Вы (по-видимому), имеет, код, который выполняет дополнительные вызовы к базе данных без Вас (разработчик) быть знающим о ней. Например, Вы могли бы назвать метод, который возвращает набор объектов Человека, и думайте, что единственной вещью, продолжающейся под капотом, является единственный "ВЫБОР * ОТ ЛЮДЕЙ" вызов. В действительности метод, который Вы называете, мог бы выполнить итерации через возвращенный набор объектов Человека и выполнить дополнительные вызовы DB для заполнения набора Заказов каждого Человека.

Как Вы говорите, одно из Ваших решений не состоит в том, чтобы возвратить полностью-загруженные-объекты, таким образом, Вы, вероятно, знаете об этой потенциальной проблеме. Одна из причин, я склонен избегать использования оберток строки, - то, что они неизменно мешают настраивать Ваше приложение и минимизировать размер и частоту трафика базы данных.

1
ответ дан 10 December 2019 в 00:46
поделиться

В ASP.NET я использовал бы подкачку страниц серверной стороны, где Вы только получаете страницу данных, пользователь запросил от хранилища данных. Это настроено против получения всего набора результатов, помещения его в память и пролистывание его по запросу.

0
ответ дан 10 December 2019 в 00:46
поделиться

JSF или JavaServerFaces имеют виджеты для разделения на блоки больших наборов результатов к браузеру. Это может быть параметризовано, как Вы предполагаете. Я не назвал бы это "стандартным промышленным шаблоном разработки" каким-либо образом, но это достойное внимания, чтобы видеть, как кто-то еще решил проблему.

0
ответ дан 10 December 2019 в 00:46
поделиться

Когда я имею дело с этим типом проблемы, я обычно разделяю на блоки данные, отправленные в браузер (или тонкий / толстый клиент, какой бы ни более подходит для Вашей ситуации) как независимо от фактического общего размера данных, которые соответствуют некоторым определенным критериям, только небольшая часть действительно применима в любом UI когда-то.

Я живу в мире Microsoft, таким образом, моей основной средой является ASP.NET с SQL Server. Вот две статьи о подкачке страниц (которые упоминают некоторые методы для пролистывания наборов результатов), который может быть полезным:

Пролистывание большого количества данных эффективно (и в Ajax путь) с ASP.NET 2.0 Эффективная подкачка страниц данных с ASP.NET 2.0 управления DataList и ObjectDataSource

Другой механизм, который Microsoft поставила в последнее время, является их идеей "Динамических Данных" - Вы смогли проверять кишки этого для некоторого руководства относительно того, как они занимаются этой проблемой.

0
ответ дан 10 December 2019 в 00:46
поделиться

Мягкая фетровая шляпа цифровой проект репозитория возвращает максимальное количество результатов с идентификатором набора результатов. Вы затем получаете остальную часть результата путем просьбы следующий блок, предоставляющий идентификатор набора результатов в последующем запросе. Это работает хорошо, пока Вы не хотите делать любой поиск или сортировку за пределами запроса.

0
ответ дан 10 December 2019 в 00:46
поделиться

Я сделал подобные вещи на двух различных продуктах. В одном случае источник данных дополнительно нумеруется страницы - для Java, реализует интерфейс Pageable, подобный:

public interface Pageable
{
    public void setStartIndex( int index );
    public int getStartIndex();
    public int getRowsPerPage() throws Exception;
    public void setRowsPerPage( int rowsPerPage );
}

Источник данных реализует другой метод для, добираются () объектов, и реализация нумеровавшего страницы источника данных просто возвращает текущую страницу. Таким образом, можно установить индекс запуска и захватить страницу в контроллере.

Одна вещь рассмотреть будет состоять в том, чтобы кэшировать Вашу сторону сервера курсоров. Для веб-приложения необходимо будет истечь их, но они действительно помогут мудрой производительности.

0
ответ дан 10 December 2019 в 00:46
поделиться

От datay слоя извлечения стандартный шаблон разработки должен иметь два интерфейса метода, один для всех и один для размера блока.

При необходимости можно разделить на уровни компоненты, которые делают подкачку страниц по нему.

0
ответ дан 10 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: