Вопрос

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

  • Как Nhibernate обрабатывает план выполнения?
  • Используется ли план исполнения повторно в Nhibernate?
Это было полезно?

Решение

Чтобы ответить на ваш первый вопрос, Nhibernate не обрабатывает планы выполнения. SQL Server обрабатывает планы выполнения. Если динамический SQL, произведенный Nhibernate, параметризован, планы будут классифицированы как «подготовленный» и будут использоваться повторно, предполагая, что параметры, представленные в каждом последующем выполнении, могут создавать тот же оптимизированный план запроса. Если динамический SQL не параметризован, план выполнения будет классифицирован как «ADHOC» и мог все еще будет использоваться повторно.

Я использую этот бит T-SQL для мониторинга размеров кэша для различных планов запросов. Я полагаю, что скопировал это с сайта Пола Рэндала (http://www.sqlskills.com/blogs/paul/), но это было так долго, что я больше не могу знать наверняка.

SELECT 
    objtype AS [CacheType],
    count_big(*) AS [Total Plans],
    sum(cast(size_in_bytes as decimal(12,2)))/1024/1024 AS [Total MBs],
    avg(usecounts) AS [Avg Use Count],
    sum(cast((CASE WHEN usecounts = 1 THEN size_in_bytes ELSE 0 END) as decimal(12,2)))/1024/1024 AS [Total MBs - USE Count 1],
    sum(CASE WHEN usecounts = 1 THEN 1 ELSE 0 END) AS [Total Plans - USE Count 1]
FROM sys.dm_exec_cached_plans
GROUP BY objtype
ORDER BY [Total MBs - USE Count 1] DESC;
GO

Другие советы

Ормы обычно сами не являются проблемой, это то, как они используются. SQL Server генерирует план выполнения. Nhibernate может генерировать запрос, который заставляет SQL генерировать плохой план выполнения. Если вы используете переменные в своих запросах, то планы выполнения могут быть использованы повторно. Строковая конкатенация обычно предотвращает повторное использование плана. Видеть этот вопрос для получения дополнительной информации.

Помимо проблемы параметризации, которая уже была упомянута, все ORM могут привести к созданию действительно дерьмовых планов. Это делается чаще всего, когда существует множество вариантов поиска, вызывая действительно большой предложение в запросе SQL Server, который полон или операторов, с которыми SQL Server не может многое сделать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top