WEB开发网
开发学院数据库MSSQL Server SQL Server 2005 中的批编译、重新编译和计划缓存... 阅读

SQL Server 2005 中的批编译、重新编译和计划缓存问题(1)

 2007-05-13 09:24:59 来源:WEB开发网   
核心提示: 一个批处理可包含一个或多个 SELECT、INSERT、UPDATE 和 DELETE 语句、存储过程调用(T-SQL“粘连”或控制结构(比如:SET、IF、WHILE、DECLARE)可能使其产生交错)、DDL 语句(比如:CREATE、DROP)以及与权限相关的

一个批处理可包含一个或多个 SELECT、INSERT、UPDATE 和 DELETE 语句、存储过程调用(T-SQL“粘连”或控制结构(比如:SET、IF、WHILE、DECLARE)可能使其产生交错)、DDL 语句(比如:CREATE、DROP)以及与权限相关的语句(比如:GRANT、DENY 和 REVOKE)。批处理还可包含 CLR 构造的定义和用法(比如:用户定义的类型、函数、过程和聚合)。

已编译的计划被保存到 SQL Server 的一部分内存中,这部分内存称为计划缓存。将搜索计划缓存以获得重用计划的机会。如果对某个批处理重用计划,就可避免编译工作。请注意,在有关 SQL Server 的文献中,过去所用的“过程缓存”一词在本文中被称为“计划缓存”。“计划缓存”用词更准确,因为计划缓存不仅仅保存存储过程的查询计划。

在涉及 SQL Server 的用语中,上段所提到的编译过程有时会被误认为是“重新编译”,但该过程仅涉及“编译”。

重新编译的定义:假设某个批处理被编译成一个或多个查询计划的集合。在 SQL Server 开始执行任何单独的查询计划之前,服务器将检查该查询计划的有效性(正确性)和最优性。如果某个检查失败了,将重新编译相应查询计划所对应的语句或整个批处理,并可能生成一个不同的查询计划。这种编译称为“重新编译”。

请特别注意,不必预先缓存该批处理的查询计划。实际上,某些批处理类型从不被缓存,但仍能引发重新编译。举个例,有个批处理包含一个大于 8 KB 的文本。假设该批处理创建了一个临时表,并在表中插入了 20 行。所插入的第七行将导致重新编译,但由于其包含的文本较大,将不缓存该批处理。

在 SQL Server 中执行的多数重新编译都是有根据的。有些是为了确保语句的正确性;另一些是为了在 SQL Server 数据库中的数据发生变化时,获得最佳的查询执行计划。然而,重新编译有时会大大延缓批处理执行的速度。这时,就有必要减少进行重新编译的次数。

上一页  1 2 3 4 5 6 7  下一页

Tags:SQL Server 编译

编辑录入:coldstar [复制链接] [打 印]
赞助商链接