Какой тип запросов Linq to SQL должен быть скомпилирован? - PullRequest
6 голосов
/ 02 августа 2011

Я использую Linq to SQL для проекта и прочитал статьи о том, насколько неэффективна эта структура.Я читал, что один из способов резко повысить производительность - это создавать скомпилированные запросы.Все ли запросы будут лучше скомпилированы?Или есть определенные случаи, когда это может не иметь большого значения?Я предполагаю, что это критически важно для крупномасштабных приложений, которые получают большой объем трафика.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 02 августа 2011

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

Я работал над некоторыми отчетами, выполнение которых заняло 30-40 минут. Я обнаружил, что мы звонили по определенным запросам сотни и тысячи раз. Компиляция запросов принесла улучшения, но этого было недостаточно.

Я закончил тем, что выполнял меньше запросов, которые возвращали больше данных. Это меньше открытия и закрытия соединений. Результатом были отчеты, которые выполнялись менее чем за минуту.

Итак, если вам нужно выполнить запрос несколько раз, его компиляция - отличный вариант. Если он работает сотни или тысячи раз, вам может понадобиться новый подход.

Несколько сообщений об этих двух вещах:

Оптимизация SQL-запросов для отчетов: другой подход :

http://www.foliotek.com/devblog/sql-query-optimization-for-reporting-a-different-approach/

Неожиданные преимущества предварительно скомпилированных запросов в Linq:

http://www.foliotek.com/devblog/unexpected-benefits-of-precompilation-of-linq/

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

4 голосов
/ 02 августа 2011

Остерегайтесь преждевременной оптимизации!

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

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

Как только вы это сделаете и по-прежнему обнаружите, что при составлении запроса есть узкое место, есть вероятность, что 90% вашего времени тратится примерно на 5% (или меньше) запросов, которые вы выполняете,Оптимизируйте только эти запросы.

Обновление

Современные реализации Entity Framework теперь имеют встроенное кэширование запросов, поэтому, просто используя современную версию .NET, вы, вероятно, получите 90% преимуществпредварительно скомпилированные запросы предложили бы вам в любом случае.Это еще одна причина не беспокоиться об изменении структуры кода для обеспечения теоретического повышения производительности.

2 голосов
/ 02 августа 2011

Если у вас есть похожие запросы, выполняемые снова и снова, вы можете повысить производительность, скомпилировав их.

Хотя есть некоторые оговорки: http://omaralzabir.com/solving_common_problems_with_compiled_queries_in_linq_to_sql_for_high_demand_asp_net_websites/

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