ITPub博客

首页 > Linux操作系统 > Linux操作系统 > sqlserver2005预编译

sqlserver2005预编译

原创 Linux操作系统 作者:zhouwf0726 时间:2019-05-02 12:51:07 0 删除 编辑
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_executesql、sp_prepare 和 sp_prepexec 提交的语句,不带有在 TF 447 下自动参数化的参数。

•

当要求查询通知时。

•

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

•

当查询包含 FOR UPDATE 子句时。

•

当 UPDATE 包含 ORDER BY 子句时。

•

当查询包含 GROUPING 子句时。

•

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

•

INSERT ...EXEC 语句。

•

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

WHERE 20 > 5
•

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

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

上一篇: oracle enqueue(zt)
请登录后发表评论 登录
全部评论

注册时间:2006-02-22

  • 博文量
    458
  • 访问量
    416604