SqlServer参数化脚本与自动参数化(简单参数化)
2015-06-25 20:37
260 查看
如果执行不带参数的SQL语句,SQLServer会在内部对该语句进行参数化以增加将其与现有执行计划相匹配的可能性。此过程称为简单参数化(在SQLServer2000中,称为自动参数化),最终起到执行计划重用的效果。
当然从最终的执行计划缓存中可以看到,直接执行的SQL脚本在缓存中还是会有对应的一条记录。原来第一条执行的SQL会生成两条执行计划,其中一个就是对明显的常量进行参数化,然后再根据这个参数化的执行计划,生成自己的adhoc执行计划。后来的SQL命中已经生成的执行计划,可以节省一部分的编译时间。
可以想象,非参数化SQL的执行计划仍然需要在数据库内存中存储,并且对于新的SQL脚本SqlServer也需要按照一定的算法找到对应的参数化执行计划,不晓得这些需要耗费多少资源呢?目前还不清楚如何查看这类的信息。
SqlServerProfiler的跟踪结果如下:
补充:
从sys.dm_exec_cached_plans视图可以统计出缓存执行计划的内存占用(SqlServer的内存占用 )。
--从数据缓冲池中删除所有缓存 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视图可以统计出缓存执行计划的内存占用(
相关文章推荐
- adb操作sqlite3数据库
- [MySQL] lock知识梳理
- golang sortedset 实现(基于redis skiplist)
- Oracle 11g启动不了:Out Of Memory
- Oracle 11.2.0.4/12C新特性Valid Node Checking For Registration (VNCR)
- 修改及查看mysql数据库的字符集
- MySQL数据库基础
- C# 文件与二进制互转数据库写入读出
- SQL中的重要语句
- oracle sql语言模糊查询--通配符like的使用教程
- Oracle索引详细解析
- oracle 按天数统计数据
- mysql锁的问题
- mongoDB命令
- 关于dump
- Oracle:杀死死锁进程
- MySQL详解(5)-----------函数超全总结
- oracle substr,substrb ,instr,instrb函数的用法以及like的优化
- Oracle 存储过程_(收集)
- MFC SQlite3封装工程