SqlServer参数化脚本与自动参数化(简单参数化)

Posted 有梦就能实现

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SqlServer参数化脚本与自动参数化(简单参数化)相关的知识,希望对你有一定的参考价值。

    如果执行不带参数的SQL语句,SQL Server会在内部对该语句进行参数化以增加将其与现有执行计划相匹配的可能性。此过程称为简单参数化(在SQL Server 2000中,称为自动参数化),最终起到执行计划重用的效果。

复制代码
--从数据缓冲池中删除所有缓存
DBCC DROPCLEANBUFFERS    
GO
--从执行计划缓冲区删除所有缓存的执行计划
DBCC FREEPROCCACHE        
GO
--执行不带参数的SQL语句,SQL Server会在内部对该语句进行参数化以增加将其与现有执行计划相匹配的可能性。
--此过程称为简单参数化(在SQL Server 2000中,称为自动参数化),最终起到执行计划重用的效果。 
select * from WORKITEM t where t.WORKITEMID = \'67f956f5-a350-4254-b214-84b72c85664e\'
go
select * from WORKITEM t where t.WORKITEMID = \'b1e337b3-9b2a-4463-9692-7a738ebba205\'
go
select * from WORKITEM t where t.WORKITEMID = \'c059be96-aea3-42a1-8f66-b67c0dd79fa6\'
go

--使用参数化的方式执行
sp_executesql N\'select * from WORKITEM t where t.WORKITEMID = @wid\', N\'@wid varchar(36)\', @wid=\'67f956f5-a350-4254-b214-84b72c85664e\' 
go 
sp_executesql N\'select * from WORKITEM t where t.WORKITEMID = @wid\', N\'@wid varchar(36)\', @wid=\'b1e337b3-9b2a-4463-9692-7a738ebba205\'
go
sp_executesql N\'select * from WORKITEM t where t.WORKITEMID = @wid\', N\'@wid varchar(36)\', @wid=\'c059be96-aea3-42a1-8f66-b67c0dd79fa6\'
go


SELECT    cacheobjtype, objtype, usecounts, refcounts, pagesused, sql 
FROM    sys.syscacheobjects 
WHERE    cacheobjtype = \'Compiled Plan\' and sql not like \'%syscacheobjects%\' and
        sql LIKE \'%from WORKITEM t where %\'
 
复制代码
--如果SQL脚本内容较长,可使用sys.dm_exec_cached_plans、sys.dm_exec_sql_text 
select    t.cacheobjtype, t.objtype, t.usecounts, t.refcounts, dc.text 
from    sys.dm_exec_cached_plans t
    cross apply sys.dm_exec_sql_text(t.plan_handle) dc
where    t.cacheobjtype = \'Compiled Plan\' and dc.text not like \'%dm_exec_cached_plans%\' and 
        dc.text like \'%from WORKITEM t where %\'

 

      当然从最终的执行计划缓存中可以看到,直接执行的SQL脚本在缓存中还是会有对应的一条记录。原来第一条执行的SQL会生成两条执行计划,其中一个就是对明显的常量进行参数化,然后再根据这个参数化的执行计划,生成自己的adhoc执行计划。后来的SQL命中已经生成的执行计划,可以节省一部分的编译时间。

      可以想象,非参数化SQL的执行计划仍然需要在数据库内存中存储,并且对于新的SQL脚本SqlServer也需要按照一定的算法找到对应的参数化执行计划,不晓得这些需要耗费多少资源呢?目前还不清楚如何查看这类的信息。

image

 

SqlServer Profiler的跟踪结果如下:

image

 

补充:

     从sys.dm_exec_cached_plans视图可以统计出缓存执行计划的内存占用(SqlServer的内存占用)。

以上是关于SqlServer参数化脚本与自动参数化(简单参数化)的主要内容,如果未能解决你的问题,请参考以下文章

Jmeter参数化

jmeter参数化

Jmeter参数化

AndroidDriver 不是通用的,不能参数化

selenium+python自动化78-autoit参数化与批量上传

SQL Server SQL性能优化之--数据库在“简单”参数化模式下,自动参数化SQL带来的问题