您的位置:首页 > 数据库

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

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

--从数据缓冲池中删除所有缓存
DBCCDROPCLEANBUFFERS
GO
--从执行计划缓冲区删除所有缓存的执行计划
DBCCFREEPROCCACHE
GO

--执行不带参数的SQL语句,SQLServer会在内部对该语句进行参数化以增加将其与现有执行计划相匹配的可能性。

--此过程称为简单参数化(在SQLServer2000中,称为自动参数化),最终起到执行计划重用的效果。
select*fromWORKITEMtwheret.WORKITEMID='67f956f5-a350-4254-b214-84b72c85664e'
go
select*fromWORKITEMtwheret.WORKITEMID='b1e337b3-9b2a-4463-9692-7a738ebba205'
go
select*fromWORKITEMtwheret.WORKITEMID='c059be96-aea3-42a1-8f66-b67c0dd79fa6'
go

--使用参数化的方式执行
sp_executesqlN'select*fromWORKITEMtwheret.WORKITEMID=@wid',N'@widvarchar(36)',@wid='67f956f5-a350-4254-b214-84b72c85664e'

go

sp_executesqlN'select*fromWORKITEMtwheret.WORKITEMID=@wid',N'@widvarchar(36)',@wid='b1e337b3-9b2a-4463-9692-7a738ebba205'
go
sp_executesqlN'select*fromWORKITEMtwheret.WORKITEMID=@wid',N'@widvarchar(36)',@wid='c059be96-aea3-42a1-8f66-b67c0dd79fa6'
go

SELECTcacheobjtype,objtype,usecounts,refcounts,pagesused,sql
FROMsys.syscacheobjects
WHEREcacheobjtype='CompiledPlan'andsqlnotlike'%syscacheobjects%'and
sqlLIKE'%fromWORKITEMtwhere%'



--如果SQL脚本内容较长,可使用sys.dm_exec_cached_plans、sys.dm_exec_sql_text

selectt.cacheobjtype,t.objtype,t.usecounts,t.refcounts,dc.text
fromsys.dm_exec_cached_planst
crossapplysys.dm_exec_sql_text(t.plan_handle)dc
wheret.cacheobjtype='CompiledPlan'anddc.textnotlike'%dm_exec_cached_plans%'and
dc.textlike'%fromWORKITEMtwhere%'


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

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





SqlServerProfiler的跟踪结果如下:





补充:

从sys.dm_exec_cached_plans视图可以统计出缓存执行计划的内存占用(SqlServer的内存占用)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: