你的位置:首页 > 软件开发 > 数据库 > SQL Server里简单参数化的痛苦

SQL Server里简单参数化的痛苦

发布时间:2015-08-18 09:00:07
在今天的文章里,我想谈下对于即席SQL语句(ad-hoc SQL statements),SQL Server使用的简单参数化(Simple Parameterization)的一些特性和副作用。首先,如果你的SQL语句包含这些,简单参数化不会发生:JOININBULK INSE ...

SQL Server里简单参数化的痛苦

在今天的文章里,我想谈下对于即席SQL语句(ad-hoc SQL statements),Server.aspx' target='_blank'>SQL Server使用的简单参数化(Simple Parameterization)的一些特性和副作用。首先,如果你的SQL语句包含这些,简单参数化不会发生:

  • JOIN
  • IN
  • BULK INSERT
  • UNION
  • INTO
  • DISTINCT
  • TOP
  • GROUP BY
  • HAVING
  • COMPUTE
  • Sub Queries

一般来说,如果你处理所谓的安全执行计划(Safe Execution Plan),SQL Server自动参数化你的SQL语句:不管提供的参数值,查询总必须通向一样的执行计划。如果你的执行计划里有书签查找,这就是不可能的例子。因为临界点定义了是否进行书签查找还是全表/聚集索引扫描。

自动参数化并不那么酷!

如果SQL Server能自动参数化你的SQL语句,你还是要考虑下SQL Server引入的自动参数化SQL语句的一些副作用。我们来看一个具体的例子。下列查询创建一个表,执行一个会被SQL Server自动参数化的简单SQL语句。

 1 -- Create a simple table 2 CREATE TABLE Orders 3 ( 4   Col1 INT IDENTITY(1, 1) PRIMARY KEY NOT NULL, 5   Price DECIMAL(18, 2) 6 ) 7 GO 8  9 -- This query gets auto parametrized, because it is a simple query with a safe (consistent) plan10 SELECT * FROM Orders11 WHERE Price = 5.7012 GO13 14 -- Analyze the Plan Cache15 SELECT16   st.text, 17   qs.execution_count, 18   cp.cacheobjtype,19   cp.objtype,20   cp.*,21   qs.*, 22   p.* 23 FROM sys.dm_exec_cached_plans cp24 CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) p25 CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st26 LEFT JOIN sys.dm_exec_query_stats qs ON qs.plan_handle = cp.plan_handle27 WHERE st.text LIKE '%Orders%'28 GO

原标题:SQL Server里简单参数化的痛苦

关键词:sql

sql
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。