我知道这个选项的作用以及如何启用它。我的问题是如果我启用它会发生什么。
无需提供太多信息,我们的会计系统是 Microsoft Dynamics 产品,它使用 VM、32GB RAM(SQL Server [2008 R2] 可用 28GB)。他们让他们的供应商来查看我们的配置,以解决会计团队已经看到的某些性能问题。他们甚至让另一个 DBA 来看看我们的配置。他的建议之一是“查看缺失的索引”。我们可以说几乎每个存在的 SQL 服务器实例,每个表都有一个唯一的非聚集索引,这不是我的选择,但我告诉我,对软件访问的表上的索引进行任何更改都可能导致问题小贩。他的第二个是启用“针对临时工作负载进行优化”。我'
通过针对临时工作负载进行优化,我知道单次使用计划存储为存根,整个计划实际上并没有保存在缓存中,直到计划运行两次。有了这样的系统,我们真的会看到任何形式的性能提升吗?根据 Kimberly Tripp 的文章,我运行了以下查询:
SELECT objtype AS [CacheType]
,count_big(*) AS [Total Plans]
,sum(cast(size_in_bytes AS DECIMAL(18, 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(18, 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
这是我得到的结果:
现在,我们可以看到,我们有大约 1.7GB 的单次使用计划。可能值得打开此选项,因为该框有 28GB 可用于 SQL 服务器,对吧?好吧,我们正在谈论释放 1-1.25GB 的空间,因为存根仍然占用空间,只是没有那么多。我运行了一个查询来提取所有单次使用计划并获取它们的大小,我们最大的计划约为 1-1.5MB。
所以,这是我的问题(抱歉花了一段时间才真正解决这些问题):
- 我们真的认为我们会在这里看到可衡量的性能提升吗?如果是这样,除了查看上面查询中使用的空间之外,我们如何量化它?
- 可以理解的是,我犹豫在生产系统上使用这样的开关。我应该注意哪些影响?过程缓存会自行擦除并重建吗?开启此功能时,我应该注意哪些问题?
克里斯,
这取决于,但我对你提供的数据的直觉是 - 不。当然,您可能会节省一些空间,因为计划存根仍会占用内存,只是不会那么多(与您的 1 MB 计划相比)。所以你会净记忆,我们明白了。但是,我们不知道这些计划中有多少是单次执行的,然后在某个时间点仍在缓存中时再次执行。这带来了关于编译/重新编译以及随之而来的 cpu 利用率的问题。如果您有足够的空间,那么这可能是一个微不足道的问题(双关语)。
如果您的服务器没有受到内存压力,我不希望在“性能”方面看到太多改进,具体取决于您希望如何对其进行分类。如果您正在交换并且有一些轻微的内存压力,这可以暂时缓解它 - 尽管增加 VM 内存会以更快的实施速度产生相同的效果,而不会产生负面的副作用成本。
根据 BOL,它不会影响当前计划缓存中的任何内容:“将针对临时工作负载的优化设置为 1 只会影响新计划;已经在计划缓存中的计划不受影响。” http://msdn.microsoft.com/en-us/library/cc645587(v=sql.105).aspx
您可能会看到计划编译的 cpu 命中的可能性(取决于最终的重用)(因为它必须执行两次,一次用于原始执行,然后一次用于存储它的第二次)。
其他一些“奇怪”将包括监控工具,特别是如果它们正在获取执行计划,因为计划存根与它们没有任何关联。一些奇怪的结果可能来自那些期望始终存在关联的工具。
我对 Dynamics 不是非常熟悉,但 IIRC,它有一个特定的 Microsoft 设置指南,如 SharePoint。我会仔细检查这不会使您对产品的支持无效。