在今天的文章里,我想谈下对于即席SQL语句(ad-hoc SQL statements),SQL Server使用的简单参数化(Simple Parameterization)的一些特性和副作用。首先,如果你的SQL语句包含这些,简单参数化不会发生:JOININBULK INSE ...
在今天的文章里,我想谈下对于即席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
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。