Что быстрее: фильтрация DataSet в памяти или возврат набора результатов из SQL Server? - PullRequest
2 голосов
/ 20 июля 2011

Я работаю над довольно большой таблицей (800k записей и восхождений), и я бы хотел отфильтровать эту таблицу. Дело в том, что таблица хранится в SQL Server. Итак, мне было интересно, будет ли

SELECT * FROM table WHERE condition1=true

запрос будет быстрее, чем загрузка таблицы в типизированный DataSet и использование DataRow.Find (), а затем отправка всех этих данных в другой DataTable?

Наверное, да, но все равно спрошу.

Ответы [ 6 ]

5 голосов
/ 20 июля 2011

Пока ваш SQL-сервер не выполняет подкачку из-за нехватки ОЗУ, SQL-сервер всегда должен работать быстрее, чем загружать всю таблицу через сеть и затем выполнять локальную фильтрацию ...

3 голосов
/ 20 июля 2011

Вы обязательно должны сделать это в SQL Server, потому что:

  1. Это одна из вещей, на которые рассчитан сервер баз данных и на котором он хорош. Если условие всегда включает одни и те же столбцы, возможно, вы захотите добавить индексы, чтобы еще больше ускорить поиск.
  2. Производительность всегда быстрее загружать меньше данных
  3. Ваше потребление памяти взорвется, когда вы попытаетесь загрузить все это в память. Особенно, когда стол растет несвязанным. Теперь это может работать нормально, но может неожиданно убить вас позже.
2 голосов
/ 20 июля 2011

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

1 голос
/ 27 июля 2017

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

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

Есть несколько функций SQL, например если вам нужно сделать что-то вроде WHERE LocationId IN (1, 2, 3, 4, 5, 6), которое в SQL работает намного хуже, чем dataset.LocationIds.Where(id => myValues.Contains(id)) в C #, для больших наборов данных , то в этой ситуации, если вы измерили это, вы должны найти в -память работает лучше всего.

A SELECT с простыми условиями WHERE почти наверняка будет быстрее в SQL. Вот почему вы должны оценивать каждый сценарий, тестировать и измерять при необходимости.

0 голосов
/ 20 августа 2017

Я понял, что этот вопрос старый, но во всех ответах отсутствует важный момент. База данных может использовать критерии фильтрации вместе с индексами таблиц, чтобы загружать меньше данных с диска . Например, если вы должны выполнить SELECT * FROM X WHERE ID = 7, то (при условии, что ID здесь является первичным ключом) база данных загрузит только одну строку с диска. Если вы отфильтруете эти данные на стороне сервера, то базе данных потребуется загрузить всю таблицу с диска.

Предполагая, что вы связаны с вводом / выводом, это даст вам значительно лучшую производительность. Конечно, не все критерии фильтра могут работать таким образом. Это зависит от сервера базы данных, индексов и т. Д.

0 голосов
/ 20 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...