zoukankan      html  css  js  c++  java
  • 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的内存占用)。

  • 相关阅读:
    微信公众号开发之用户地理位置坐标转百度坐标
    PHP变量入门教程(1)基础
    【很变态】PHP类实例化对象竟然可以访问类的“静态(static)方法”!!!
    【转】记录PHP、MySQL在高并发场景下产生的一次事故
    PHP返回32位与16位的md5加密值
    PhpStorm 8.x/9.x 快捷键设置/个性化设置,如何多项目共存?如何更换主题?
    Linux设置Memcached开机启动
    【荐】MongoDB基本命令大全
    【荐】PHP操作MongoDB GridFS 存储文件,如图片文件
    Shell入门教程:流程控制(7)break和continue
  • 原文地址:https://www.cnblogs.com/firstdream/p/7931837.html
Copyright © 2011-2022 走看看