快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

和记娱棒h88285:《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(8)



上文主要先容了已编译计划、履行高低文和计划缓存元数据相关的几个常用的系统函数,并先容了几个葵花宝典级的调优语句。本文将继承关注缓存大年夜小治理、缓存项的资源(Costing of Cache entries)

■缓存大年夜小治理

我们已经懂得计划重用和SQL Serve和记娱棒h88285r若何在缓存中查找一个计划。现在,我们看看SQL Server若何治理计划缓存的大年夜小以及它若何抉择在缓存中没有空间时某个计划被移除。前面已经先容的部分,全局操作类如DBCC FREEPROCCACHE会从缓存中清除所有计划,而alter procrdure时会从缓存中清除所有与这个存储历程相关的计划。此外,在大年夜多半其他环境下,仅仅当SQL Server面临内存压力时才会从缓存中移除计划。SQL Server用于抉择何时和计划若何应该被从缓存中移除的算法称为“收受接收策略”(eviction policy)。每个缓存历程都有自己的eviction policy,我们仅仅评论争论工具计划历程和SQL计划历程。

抉择哪个计划被收受接收是基于计划的资源,后文评论争论。收受接收在SQL Server侦察到内存压力和记娱棒h88285时开始,首先是零资源的计划被移除,其他计划的资源减半。两种内存压力为:本地内存压力和全局内存压力。

评论争论内存压力时,我们不得不提到一个词,可见内存(visible memory),可见内存是在SQL Server缓冲池中可以直接地址化的可用物理内存。

在一个32位SQL Server实例中,可见内存的最大年夜值为2-3GB,这取决于你在boot.ini文件中是否设置/3GB标志开关。大年夜于这个数字的带有地址的内存仅仅经由过程AWE-mapped-memory间接实现。

而一个64位SQL Server实例中,所有内存整个可以直接地址化,整个是可见内存。 你可以经由过程一个名为sys.dm_os_sys_info的DMV的一个列bpool_visible来查看这个值,这是一个8KB的buffer值。

别的,请留意,SQL 2005的不合版本及不合的SP对应的计划缓存压力限制值均不一样,即SP!与SP2对应的值不一样。SQL Server2008也是如斯。 32位与64位更是不合。

SQL Server版本

Cache Pressure Limit

SQL Server 2005 RTM&SP1

75%的可见目标内存0-8GB

+50%的可见目标内存8GB-64GB

+25%的可见目标内存>64GB

SQL Server 2005 SP2&SP3

SQL Server 2008 RTM

75%的可见目标内存0-4GB

+10%的可见目标内存4GB-64GB和记娱棒h88285

+5%的可见目标内存>64GB

SQL Server 2000

4GB upper cap on the plan cache

例如,一个64位SQL Server 2008 RTM实例,28GB目标内存。那么这个上限(Limit)将是75%*4GB+10%*(28-4)GB=3+2.4=5.4GB

◆局部内存变量

假如单个缓存存储增长太大年夜,它标示局部内存压力,SQL Server开始仅仅从该存储中移除项,这种行径防止一个存储占用太多的总系统内存。

在单个页分配时,假如缓存达到计划缓存压力上限和记娱棒h88285的75%,如上表所示,或多个分配页时达到计划缓存压力限制的50%和记娱棒h88285,内部内存压力被触发,计划开始从缓存中移除。如上例中,假如缓存存储达到75%*5.4GB=4.05GB,此时某些计划开始按指定资源顺序移除,假如刚好有一些计划添加到缓存,这一进一出,将会引起新计划的相应光阴增添。

除了内存数量达到压力上限外,SQL Server在一个存储上钩划数量达到该存储中哈希表大年夜小的四倍时,也会触发内存压力上限。如上文所示。哈希表中大年夜约10000-40000wh Bucket,也就意味着SQL存储或工具存储跨越40000-160000项。下面的查询分手返回哈希表中的buckets数量和每个存储中荐的数量:

SELECT type as 'plan cache store', buckets_count

FROM sys.dm_os_memory_cache_hash_tables

WHERE type IN ('CACHESTORE_OBJCP', 'CACHESTORE_SQLCP');

GO

SELECT type, count(*) total_entries

FROM sys.dm_os_memory_cache_entries

WHERE type IN ('CACHESTORE_SQLCP', 'CACHESTORE_OBJCP')

GROUP BY type;

GO

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: