SQL Server 2005 中的批编译、重新编译和计划缓存问题(1)
2007-05-13 09:24:59 来源:WEB开发网5.
存储过程(含触发器)。存储过程设计用于促进计划重用。计划重用基于存储过程或触发器的名称。(但是,无法直接调用触发器。)SQL Server 在内部将存储过程的名称转化为 ID,而随后的计划重用将根据该 ID 的值来进行。触发器的计划缓存和重新编译行为与存储过程略有不同。我们将在本文档的适当位置指出这些不同之处。
当首次编译一个存储过程时,执行调用所提供的参数的值被用于优化该存储过程中的语句。这个过程被称为“参数嗅探”。如果这些值都是典型的,那么针对该存储过程的所有调用将从一个高效的查询计划中获益。本文随后将讨论可用于防止缓存带有非典型的存储过程参数值的查询计划。
6.
批处理.如果批处理文本完全匹配,那么将对相应的批处理进行查询计划重用。文本必须在大小写和空格上都匹配。
7.
通过 EXEC ( ...) 执行查询。SQL Server 2005 可缓存通过 EXEC 提交的字符串以便执行。这些字符串称为“动态 SQL”。例如:
EXEC ( 'SELECT *' + ' FROM Production.Product pr
INNER JOIN Production.ProductPhoto ph' + '
ON pr.ProductID = ph.ProductPhotoID' +
' WHERE pr.MakeFlag = ' + @mkflag )
计划重用基于在执行语句时将变量(比如:上例中的 @mkflag )替换为其实际值后得到的连锁字符串。
多级缓存
认识到多“级”缓存匹配将独立进行,这一点很重要。举个例子。假设批处理 1(非存储过程)包含下列语句(及其他):
EXEC dbo.procA批处理 2(也不是存储过程)与批处理 1 在文本上不相匹配,但包含引用相同存储过程的 “EXEC dbo.procA”。这里,批处理 1 和批处理 2 的查询计划不相匹配。然而,只要在这两个批处理的一个中执行 “EXEC dbo.procA”,同时在执行当前批处理之前执行了另一个批处理,而 procA 的查询计划仍存在于计划缓存中,就有可能实现 procA 的查询计划重用。但是,每次单独执行 procA 都会得到执行上下文。该执行上下文要么刚刚生成(如果正在使用所有现有的执行上下文),要么被重用(如果未使用的执行上下文可用)。即使使用 EXEC 执行了动态 SQL,或者在批处理 1 和批处理 2 内部执行了自动参数化语句,也有可能产生某种类型的重用。总之,下列三类批处理会启动他们自己的“级别”(无论任何包含级别中是否存在缓存匹配,都会在这些级别中产生缓存匹配):
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接