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也需要按照一定的算法找到对应的参数化执行计划,不晓得这些需要耗费多少资源呢?目前还不清楚如何查看这类的信息。

SqlServer Profiler的跟踪结果如下:

补充:
从sys.dm_exec_cached_plans视图可以统计出缓存执行计划的内存占用(SqlServer的内存占用)。
SqlServer参数化脚本与自动参数化(简单参数化)的更多相关文章
- 浅析SqlServer简单参数化模式下对sql语句自动参数化处理以及执行计划重用
我们知道,SqlServer执行sql语句的时候,有一步是对sql进行编译以生成执行计划, 在生成执行计划之前会去缓存中查找执行计划 如果执行计划缓存中有对应的执行计划缓存,那么SqlServer就会 ...
- SQL Server SQL性能优化之--数据库在“简单”参数化模式下,自动参数化SQL带来的问题
数据库参数化的模式 数据库的参数化有两种方式,简单(simple)和强制(forced),默认的参数化默认是“简单”,简单模式下,如果每次发过来的SQL,除非完全一样,否则就重编译它(特殊情况会自动参 ...
- SQL Server里简单参数化的痛苦
在今天的文章里,我想谈下对于即席SQL语句(ad-hoc SQL statements),SQL Server使用的简单参数化(Simple Parameterization)的一些特性和副作用.首先 ...
- loadrunner-录制脚本,设置代理,参数化,校验点,关联
详细记录一个脚本制作过程相关知识点 制作脚本 因为要做网页所以选择web协议,根据实际需要选择 选择浏览器地址,打开的网页网址,脚本存储地址以及初始化脚本,初始化脚本的目的是执行用例后不再执行此脚本中 ...
- selenium基础(参数化脚本)
参数化脚本 什么是参数化 参数化就是用包含多组数据的参数列表,使之替换脚本中的响应常量值,这样,在脚本运行的时候,就会使用参数表中的数据来代替脚本中的常量值 由于参数表中包含了多组数据,所以执行用例时 ...
- Java IDEA根据database以及脚本代码自动生成DO,DAO,SqlMapper文件(一)
根据数据库代码自动生成的插件挺多的,这里主要分享两种: 1.根据database以及脚本代码自动生成 2.根据mybatis-generator-core自动生成(下一章节进行分享,包含sqlserv ...
- C# 脚本代码自动登录淘宝获取用户信息
C# 脚本代码自动登录淘宝获取用户信息 最近遇到的一个需求是如何让程序自动登录淘宝, 获取用户名称等信息. 其实这个利用SS (SpiderStudio的简称) 实现起来非常简单. 十数行代码就可 ...
- bat脚本:自动压缩n天前的文件【转载】
原文如下: bat脚本:自动压缩n天前的文件-中原小伙-ChinaUnix博客http://blog.chinaunix.net/uid-24946452-id-1651762.html 磁盘 ...
- [.NET] WebApi 生成帮助文档及顺便自动创建简单的测试工具
==========最终的效果图========== ==========下面开始干活:生成帮助文档========== 一.创建 WebApi 项目 二.找到 HelpPageConfig.cs 并 ...
随机推荐
- URAL 2040 (回文自动机)
Problem Palindromes and Super Abilities 2 (URAL2040) 题目大意 给一个字符串,从左到右依次添加,询问每添加一个字符,新增加的回文串数量. 解题分析 ...
- HDU 3605
http://acm.hdu.edu.cn/showproblem.php?pid=3605 用最大流做的,G++超时,C++可以过,看别人写的叫二分图多重匹配,还不会这玩意一会学学 显然的最大流模型 ...
- bat批处理文件命令详解
bat批处理文件命令详解 echo.@.call.pause.rem(小技巧:用::代替rem)是批处理文件最常用的几个命令 echo 表示显示此命令后的字符 echo off 表示在此语句后所有运 ...
- Inno Setup脚本语法大全
Inno Setup脚本语法大全 ResourceShare Bruce 11个月前 (10-28) 6136浏览 0评论 Inno Setup 是什么?Inno Setup 是一个免费的 Win ...
- AttributeError: 'dict_values' object has no attribute 'translate'
/***************************************************************************************** * Attribu ...
- MyBatis日期有坑
使用MyBatis时,可能会遇到日期格式的时间段问题,当数据库的时间为DATE类型时,MyBatis的jdbcType应该使用DATE,否则,有时间会出现莫名的数据找不到的问题,具体原因,可以查看源码 ...
- Hadoop 流
前言 Hadoop流提供了一个API,允许用户使用任何脚本语言编写Map函数或Reduce函数. 本文对此知识点进行介绍. Hadoop流的工作原理 在以前的例子中,Map和Reduce工作都是由类来 ...
- 三 GPU 并行编程的运算架构
前言 GPU 是如何实现并行的?它实现的方式较之 CPU 的多线程又有什么分别?本文将做一个较为细致的分析. GPU 并行计算架构 GPU 并行编程的核心在于线程,一个线程就是程序中的一个单一指令流, ...
- Google Translate CLI 筆記
$ trans -shell -brief > Rien ne réussit comme le succès. Nothing succeeds like success. > Was ...
- html5表单新特性
type=range 值区域范围 默认值(0-100) type=data 选择日期 type=color value='初始值' 颜色选择器控件 type=search 搜索框效果 type=im ...