Linq to SQL: выберите оптимизацию - PullRequest
6 голосов
/ 14 октября 2008

на больших таблицах в 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 голосов
/ 14 октября 2008

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

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

4 голосов
/ 14 октября 2008

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

РЕДАКТИРОВАТЬ добавить пояснения к комментарию

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

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

3 голосов
/ 14 октября 2008

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

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

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

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

1 голос
/ 16 октября 2008

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

1 голос
/ 14 октября 2008

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

1 голос
/ 14 октября 2008

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

...