Microsoft® SQL Server™ 2000 有用于存储执行计划和数据缓冲区的内存池。池内分配给执行计划或数据缓冲区的百分比随系统状态动态波动。内存池中用于存储执行计划的部分称为过程高速缓存。
SQL Server 2000 执行计划包含下面两个主要组件:
◆查询计划
执行计划的主体是一个重入的只读数据结构,可由任意数量的用户使用。这称为查询计划。查询计划中不存储用户环境。查询计划在内存中永远不会有一个或两个以上的复本:一个复本用于所有串行执行,一个复本用于所有并行执行。并行复本覆盖所有的并行执行,与并行执行的并行度无关。
◆执行环境
每个正在执行查询的用户都有一个包含其执行专用数据(如参数值)的数据结构。该数据结构称为执行环境。执行环境数据结构可以重新使用。如果用户执行查询而其中的一个结构未使用,将会用新用户的环境重新初始化该结构。
在 SQL Server 2000 中执行任何 SQL 语句时,关系引擎将首先查看过程高速缓存中是否有用于同一 SQL 语句的现有执行计划。SQL Server 2000 重新使用所找到的任何现有计划以节省重新编译 SQL 语句的开销。如果没有现有执行计划,则 SQL Server 2000 将为查询生成新的执行计划。
SQL Server 2000 有一个高效的算法,可查找用于任何特定 SQL 语句的现有执行计划。在大多数系统中,这种扫描所使用的最小资源比通过重新使用现有计划而不是编译每个 SQL 语句所节省的资源要少。
该算法将新的 SQL 语句与高速缓存内现有的未用执行计划相匹配,并要求所有的对象引用完全合法。例如,这两个 SELECT 语句中的第一个语句与现有计划不匹配,而第二个语句则匹配:
SELECT * FROM Employees
SELECT * FROM Northwind.dbo.Employees
在 SQL Server 2000 实例中,个别执行计划重新使用的概率比在 SQL Server 6.5 或更早版本中高。
执行计划的老化
执行计划生成后便驻留在过程高速缓存中。只有当需要空间时,SQL Server 2000 才使旧的未用计划从高速缓存老化掉。每个查询计划和执行环境都有相关的成本因子,可表明编译结构所需的费用。这些数据结构还有一个年龄字段。对象每由连接引用一次,其年龄字段便按编译成本因子递增。例如,如果一个查询计划的成本因子是 8 且被引用了两次,它的年龄将变为 16。惰性写入器进程定期扫描过程高速缓存内的对象列表。惰性写入器减少每个对象的年龄字段,每扫描一次减少 1。在本例中,查询计划的年龄经过 16 次过程高速缓存扫描后减为 0,除非其他用户引用了该计划。如果满足下面三个条件,惰性写入器进程将释放对象:
内存管理器需要内存且所有可用内存都正在使用。
对象的年龄字段是 0。
对象在当前没有被连接引用。
因为每次引用对象时其年龄字段都会增加,所以经常被引用的对象的年龄字段不会减为 0,也不会从高速缓存老化掉。不经常被引用的对象将很快满足释放条件,但是不会真被释放,除非其它对象有内存需求。
重新编译执行计划
由于数据库的新状态,数据库内的某些更改可能会导致执行计划效率低下或不再有效。SQL Server 检测这些使执行计划无效的更改,并将计划标记为无效。此后,必须为执行查询的下一个连接重新编译新的计划。导致计划无效的情况包括:
对查询所引用的表或视图进行任何结构更改(ALTER TABLE 和 ALTER VIEW)。
通过语句(如 UPDATE STATISTICS)显式生成或者自动生成新的分发内容统计。
除去执行计划所使用的索引。
显式调用 sp_recompile。
对键的大量更改(其他用户对由查询引用的表使用 INSERT 或 DELETE 语句所产生的修改)。
对于带触发器的表,inserted 或 deleted 表内的行数显著增长。
阅读(3029) | 评论(0) | 转发(0) |