sqlserver2005预编译

sqlserver2005预编译

自动参数化是一个过程,SQL Server 通过这个过程将出现在 SQL 语句中的文本常量替换为诸如 @p1 和 @p2 等参数。然后,SQL 语句的已编译计划以参数化的形式被缓存在计划缓存中,以便后续的语句(只是在文本常量的值上有所不同)可重用已缓存的计划。正如第四部分所提到的,只有参数值不影响查询计划选择的 SQL 语句才会被自动参数化。

SQL Server 的 LPE(语言处理和执行)组件可参数化 SQL 语句。当发现文本常量的值不影响查询计划选择时,QP(查询处理器)组件将声明 LPE 的自动参数化尝试是“安全的”,并继续执行自动参数化;否则,将声明自动参数化是“不安全的”,并将其中止。在第 11.5 节提到的一些性能计数器的值(‘SQLServer:SQL 统计’类别)报告了有关自动参数化的统计信息。

下方列表列举了 SQL Server 2005 对其进行自动参数化的语句类型。

带有 IN 子句的查询不会被自动参数化。例如:

WHERE ProductID IN (707, 799, 905)

BULK INSERT 语句。

带有一个含变量的 SET 子句的 UPDATE 语句。例如:

UPDATE Sales.Customer 
SET CustomerType = N'S' 
WHERE CustomerType = @a

带有 UNION 的 SELECT 语句。

带有 INTO 子句的 SELECT 语句。

带有 FOR BROWSE 子句的 SELECT 或 UPDATE 语句。

带有使用 OPTION 子句指定的查询提示的语句

其 SELECT 列表包含 DISTINCT 的 SELECT 语句。

带有 TOP 子句的语句。

WAITFOR 语句。

带有 FROM 子句的 DELETE 或 UPDATE 语句。

当 FROM 子句含有下列之一时:

多个表

TABLESAMPLE 子句

表值函数或表值变量

全文表

OPENROWSET

XMLUNNEST

OPENXML

OPENQUERY

IROWSET

OPENDATASOURCE

表提示或索引提示

当 SELECT 查询包含一个子查询时

当 SELECT 语句包含 GROUP BY、HAVING 或 COMPUTE BY 时

用 WHERE 子句中的 OR 加入的表达式。

expr <> non-null-constant 形式的比较谓词。

全文谓词。

当 INSERT、UPDATE 或 DELETE 中的目标表是一个表值函数时。

通过 EXEC 字符串提交的语句。

通过 sp_executesqlsp_preparesp_prepexec 提交的语句,不带有在 TF 447 下自动参数化的参数。

当要求查询通知时。

当查询包含通用表表达式列表时。

当查询包含 FOR UPDATE 子句时。

当 UPDATE 包含 ORDER BY 子句时。

当查询包含 GROUPING 子句时。

形式如下的 INSERT 语句:INSERT INTO T DEFAULT VALUES。

INSERT ...EXEC 语句。

当查询包含两个常量的对比时。例如:

WHERE 20 > 5

通过自动参数化,可创建超过 1000 个参数。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/756652/viewspace-242524/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/756652/viewspace-242524/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值