如果执行不带参数的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参数化脚本与自动参数化(简单参数化)的更多相关文章

  1. 浅析SqlServer简单参数化模式下对sql语句自动参数化处理以及执行计划重用

    我们知道,SqlServer执行sql语句的时候,有一步是对sql进行编译以生成执行计划, 在生成执行计划之前会去缓存中查找执行计划 如果执行计划缓存中有对应的执行计划缓存,那么SqlServer就会 ...

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

    数据库参数化的模式 数据库的参数化有两种方式,简单(simple)和强制(forced),默认的参数化默认是“简单”,简单模式下,如果每次发过来的SQL,除非完全一样,否则就重编译它(特殊情况会自动参 ...

  3. SQL Server里简单参数化的痛苦

    在今天的文章里,我想谈下对于即席SQL语句(ad-hoc SQL statements),SQL Server使用的简单参数化(Simple Parameterization)的一些特性和副作用.首先 ...

  4. loadrunner-录制脚本,设置代理,参数化,校验点,关联

    详细记录一个脚本制作过程相关知识点 制作脚本 因为要做网页所以选择web协议,根据实际需要选择 选择浏览器地址,打开的网页网址,脚本存储地址以及初始化脚本,初始化脚本的目的是执行用例后不再执行此脚本中 ...

  5. selenium基础(参数化脚本)

    参数化脚本 什么是参数化 参数化就是用包含多组数据的参数列表,使之替换脚本中的响应常量值,这样,在脚本运行的时候,就会使用参数表中的数据来代替脚本中的常量值 由于参数表中包含了多组数据,所以执行用例时 ...

  6. Java IDEA根据database以及脚本代码自动生成DO,DAO,SqlMapper文件(一)

    根据数据库代码自动生成的插件挺多的,这里主要分享两种: 1.根据database以及脚本代码自动生成 2.根据mybatis-generator-core自动生成(下一章节进行分享,包含sqlserv ...

  7. C# 脚本代码自动登录淘宝获取用户信息

    C# 脚本代码自动登录淘宝获取用户信息   最近遇到的一个需求是如何让程序自动登录淘宝, 获取用户名称等信息. 其实这个利用SS (SpiderStudio的简称) 实现起来非常简单. 十数行代码就可 ...

  8. bat脚本:自动压缩n天前的文件【转载】

    原文如下: bat脚本:自动压缩n天前的文件-中原小伙-ChinaUnix博客http://blog.chinaunix.net/uid-24946452-id-1651762.html     磁盘 ...

  9. [.NET] WebApi 生成帮助文档及顺便自动创建简单的测试工具

    ==========最终的效果图========== ==========下面开始干活:生成帮助文档========== 一.创建 WebApi 项目 二.找到 HelpPageConfig.cs 并 ...

随机推荐

  1. 通过一段代码说明C#中rel与out的使用区别

    using System; public partial class testref : System.Web.UI.Page { static void outTest(out int x, out ...

  2. HDU 5040

    http://acm.hdu.edu.cn/showproblem.php?pid=5040 题意比较难懂,有摄像头的位置是可以走的,每回合开始看做人先走摄像头再转,也就是说如果你这回合走之前没有摄像 ...

  3. Condition的await-signal流程详解(转)

    上一篇文章梳理了condtion,其中侧重流程,网上看到这篇文章文章介绍的很细.值得学习.特意转载过来.   转载请注明出处:http://blog.csdn.net/luonanqin 转载路径:h ...

  4. Java 中的数组操作

    前言 在Java中,有很多封装好的类可以用来操纵数组(排序,复制等等),使得数组使用起来非常的方便.这就是高级语言带来的好处. 代码示例 - 一维数组 package test; import jav ...

  5. interproscan 的使用和遇到的问题

    错误一: 2014-10-08 13:09:32,238 [uk.ac.ebi.interpro.scan.jms.worker.LocalJobQueueListener:193] ERROR - ...

  6. Python 新手常犯错误(第一部分)

    转载自:http://blog.jobbole.com/42706/ 在之前几个月里,我教一些不了解Python的孩子来慢慢熟悉这门语言.渐渐地,我发现了一些几乎所有Python初学者都会犯的错误,所 ...

  7. TNF-mutithread 编译过程记录

    地址 https://github.com/msng4t/TNF-mutithread 地址 https://github.com/msng4t/TNF 目的:想要寻找一套性能,可读性相对较好的Soc ...

  8. leetcode 147. Insertion Sort List ----- java

    Sort a linked list using insertion sort. 插入排序. /** * Definition for singly-linked list. * public cla ...

  9. JavaScript学习记录总结(七)——dom对象应用之用户简单管理

    <!DOCTYPE html><html><head><title>users.html</title> <meta name=&qu ...

  10. Memcached安装及配置

    一.Memcached介绍 1.Memcached是国外社区网站LiveJournal团队开发,通过缓存数据库查询结果,减少数据库访问次数,从而提高动态web站点性能. 2.官方站点http://me ...