Linq to SQL: выберите оптимизацию

На больших таблицах в MSSQL; выбор конкретных столбцов приводит к большей скорости запроса. То же самое относится к Linq to SQL?

Будет ли это:

var person = from p in [DataContextObject].Persons
             where p.PersonsID == 1
             select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode };

Быстрее, чем это:

var person = from p in [DataContextObject].Persons
             where p.PersonsID == 1
             select p;

...?

6

6 ответы

Я настоятельно рекомендую LinqPad . Он бесплатный и позволяет динамически запускать запросы LINQ. Когда вы также можете посмотреть на SQL, который сгенерирован.

Вы увидите, что запрос LINQ переведет первый запрос на выбор только этих столбцов. Так что это быстрее.

6
добавлено

Если вы ограничиваете размер набора результатов, выбирая только несколько конкретных столбцов, тогда YES это будет иметь влияние.

EDIT ading clarification from comment

Как это лучше, это уменьшит размер результирующих данных, возвращаемых SQL, и уменьшит размер объектов, используемых для хранения результатов в памяти.

Это связано с тем, что в конечном итоге LINQ to SQL генерирует SQL, поэтому существуют те же преимущества в производительности.

4
добавлено
И то и другое! SQL Server быстрее реагирует, ограничивая передаваемые данные и уменьшает размер коллекции, содержащей результаты, уменьшая память
добавлено автор Mitchel Sellers, источник
В результате уменьшается распределение памяти? Или более высокая скорость?
добавлено автор roosteronacid, источник

Есть 3 аспекта с «быстрее» здесь.

  1. меньше передаваемых данных Быстрее. С другой стороны, это будет не получите значительно быстрее, если вы не выберете более одной строки или если ваше Лицо содержит некоторые другие «тяжелые» столбцы - длинные varchars, изображение и т. д.
  2. , как отметил Дж. Карран, меньше выделенная память быстрее. Здесь применяется то же замечание, что и в 1.

  3. Ваш запрос выполняется быстрее, если вы иметь индекс, содержащий все выбранные столбцы (или прикрепленные к нему, начиная с SQL Server 2005). В этом случае движку SQL Server не нужно загружать страницу с помощью строки в памяти - если ее еще нет.

Лично я бы не стал пытаться оптимизировать свои запросы таким образом (если, как я уже сказал, ваши строки содержат двоичные данные или очень длинные строки, которые вам не нужны), частично потому, что если позже вы решите, что хотите больше информацию об этом выбранном лице, вам нужно будет изменить код доступа к БД, а также просто получить доступ к свойству в POCO/анонимном классе.

3
добавлено

В дополнение к тому, что говорили другие, новая неназванная структура будет гораздо более легким, чем объект Person, - она ​​будет намного быстрее, даже если вы выберете все столбцы. (У человека есть метод/поля и т. Д., Чтобы поддерживать запись объекта обратно в базу данных. У неназванного типа нет.)

1
добавлено

Я думаю, что то же самое относится, поскольку LINQ to SQL переводит операции запроса Linq на команды SQL.

1
добавлено

Если у вас есть очень большие столбцы, такие как двоичные файлы и изображения, то это может существенно повлиять, поэтому LINQ to SQL позволяет указать задержку загрузки для определенных столбцов, чтобы вы могли выбирать целые объекты, не выполняя «выбирать новые» прогнозы ,

1
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)