NHibernate 如何处理执行计划?

Ami*_*aei 4 sql-server orm execution-plan

我从播客中听说没有 ORM 可以很好地解决执行计划重用问题。它会导致执行计划缓存增加,从而影响性能。

  • NHibernate 如何处理执行计划?
  • 执行计划是否在 NHibernate 中重用?

Mat*_*t M 6

回答你的第一个问题,NHibernate 不处理执行计划。SQL Server 处理执行计划。如果 NHibernate 生成的动态 SQL 是参数化的,则计划将被归类为“准备好的”,并假设在每个后续执行中提供的参数可以生成相同的优化查询计划,那么这些计划将被重用。如果动态SQL没有参数,执行计划将其归为“即席”和可能仍然被重用。

我使用这个 T-SQL 来监控各种查询计划的缓存大小。我相信我是从 Paul Randal 的网站 (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
Run Code Online (Sandbox Code Playgroud)


Eri*_*elp 5

ORM 通常不是问题本身,而是它们的使用方式。SQL Server 生成执行计划。NHibernate 可以生成导致 SQL 生成错误执行计划的查询。如果在查询中使用变量,则可以重用执行计划。字符串连接通常会阻止计划重用。有关更多信息,请参阅此问题