针对临时工作负载进行优化

Kri*_*yer 6 sql-server execution-plan plan-cache

我知道这个选项的作用以及如何启用它。我的问题是如果我启用它会发生什么事情。

在不提供太多信息的情况下,我们的会计系统是 Microsoft Dynamics 产品,它使用虚拟机、32GB RAM(28GB 可用于 SQL 服务器 [2008 R2])。他们让他们的供应商来查看我们的配置,以解决会计团队一直看到的某些性能问题。他们甚至让另一个 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
Run Code Online (Sandbox Code Playgroud)

这是我得到的结果:

在此处输入图片说明

现在,我们可以看到,我们有大约 1.7GB 的一次性计划。可能值得打开此选项,因为该框有 28GB 可用于 SQL 服务器,对吗?好吧,我们谈论的是释放 1-1.25GB 的空间,因为存根仍然占用空间,只是没有那么多。我运行了一个查询来提取所有一次性计划并获取它们的大小,我们最大的计划大约是 1-1.5MB。

所以,这是我的问题(抱歉,花了一段时间才真正解决这些问题):

  • 我们真的认为我们会在这里看到可衡量的性能提升吗?如果是这样,除了查看上面查询中使用的空间之外,我们如何对其进行量化?
  • 可以理解的是,我对在生产系统上抛出这样的开关犹豫不决。我应该注意哪些影响?过程缓存会自行擦除并重建吗?开启此功能时是否有任何我应该注意的问题?

Sea*_*ser 6

克里斯,

• 我们真的认为我们会在这里看到可衡量的性能提升吗?如果是这样,除了查看上面查询中使用的空间之外,我们如何对其进行量化?

这取决于,但我对你提供的数据的直觉是 - 不。当然,您可能会节省一些空间,因为计划存根仍然会占用内存,只是不会那么多(与您的 1 MB 计划相比)。所以你会净内存,我们明白了。但是,我们不知道这些计划中有多少是单次执行的,然后在某个时间点仍处于缓存中时再次执行。这带来了有关编译/重新编译以及随之而来的 CPU 利用率的问题。如果您有足够的空间,那么这可能是一个微不足道的问题(双关语)。

如果您的服务器没有内存压力,我不希望在“性能”方面看到太多改进,具体取决于您希望如何分类。如果您正在交换并且有一些轻微的内存压力,这可以暂时缓解它 - 尽管增加 VM 内存会以更快的实现速度产生相同的效果,而不会产生负面副作用成本。

• 可以理解,我对在生产系统上抛出这样的开关犹豫不决。我应该注意哪些影响?过程缓存会自行擦除并重建吗?开启此功能时是否有任何我应该注意的问题?

根据 BOL,它不会影响您计划缓存中当前的任何内容:“将临时工作负载的优化设置为 1 仅影响新计划;已在计划缓存中的计划不受影响。” http://msdn.microsoft.com/en-us/library/cc645587(v=sql.105).aspx

您可能会看到计划编译的 cpu 命中的潜力(取决于最终的重用)(因为它必须执行两次,一次用于原始执行,然后一次用于第二次存储时)。

其他一些“怪异”包括监控工具,尤其是当它们抓取执行计划时,因为计划存根与它们没有任何关联。一些奇怪的结果可能来自那些期望一直有关联的工具。

我对 Dynamics 不是很熟悉,但是 IIRC,它有一个特定的 Microsoft 设置指南,如 SharePoint。我会仔细检查这不会使您对产品的可支持性无效。