我从播客中听到,没有一些ORM具有很好的解决方案来进行执行计划。它将导致增加执行计划缓存,从而影响性能。

  • NHIBERNATE如何处理执行计划?
  • 执行计划是否在NHIBERNATE中重新使用?
有帮助吗?

解决方案

为了回答您的第一个问题,NHIBERNATE无法处理执行计划。 SQL Server处理执行计划。如果将NHIBERNATE产生的动态SQL进行参数化,则计划将被归类为“准备”,并假设每个后续执行中提供的参数可以产生相同的优化查询计划。如果动态SQL未被参数化,则执行计划将被归类为“ adhoc”,并且 可以 仍然被重复使用。

我使用这一点的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

其他提示

ORM通常不是问题本身,而是它们的使用方式。 SQL Server生成执行计划。 NHIBERNATE可以生成导致SQL生成不良执行计划的查询。如果您在查询中使用变量,则可以重复使用执行计划。字符串串联通常阻止计划重复使用。看 这个问题 有关更多信息。

除了已经提到的参数化问题外,所有ORM都可能导致生成真正糟糕的计划。当有很多搜索选项导致SQL Server查询中的子句中,SQL Server在SQL Server查询中的子句中,SQL Server在SQL Server查询中的子句中,这是最常进行的。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top