none
关于sys.dm_exec_cached_plans 和sys.dm_exec_query_stats 一些疑问 RRS feed

  • 问题

  • 环境:Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (Intel X86)   Apr  2 2010 15:53:02   Copyright (c) Microsoft Corporation  Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2) 

    测试数据库:AdventureWorks

    当我给

    AdventureWorks 数据库设置强制参数

    化后。

    使用如下代码分别在3个session中逐个运行

    SELECT soh.SalesOrderNumber ,
    sod.ProductID
    FROM Sales.SalesOrderHeader AS soh
    INNER JOIN Sales.SalesOrderDetail AS sod
    ON soh.SalesOrderID = sod.SalesOrderID
    WHERE soh.SalesOrderNumber = 'SO43662'
    SELECT soh.SalesOrderNumber ,
    sod.ProductID
    FROM Sales.SalesOrderHeader AS soh
    INNER JOIN Sales.SalesOrderDetail AS sod
    ON soh.SalesOrderID = sod.SalesOrderID
    WHERE soh.SalesOrderNumber = 'SO58928'
    SELECT soh.SalesOrderNumber ,
    sod.ProductID
    FROM Sales.SalesOrderHeader AS soh
    INNER JOIN Sales.SalesOrderDetail AS sod
    ON soh.SalesOrderID = sod.SalesOrderID
    WHERE soh.SalesOrderNumber = 'SO70907'

    再查询

    如下sql:

    SELECT b.text,a.plan_handle,a.sql_handle FROM sys.dm_exec_query_stats   a
    	CROSS APPLY sys.dm_exec_sql_text(a.sql_handle) b
    	--CROSS APPLY  sys.dm_exec_query_plan(a.plan_handle) c  
    WHERE b.text LIKE '%select%SalesOrderDetail%' AND b.text NOT LIKE ' %'
    
    SELECT b.text,c.*,a.plan_handle FROM sys.dm_exec_cached_plans  a
    	CROSS APPLY sys.dm_exec_sql_text(a.plan_handle) b
    	CROSS APPLY  sys.dm_exec_query_plan(a.plan_handle) c  
    WHERE b.text LIKE '%select%SalesOrderDetail%' AND b.text NOT LIKE ' %'

    按理来说 已经使用了强制化参数,那么应该只会产生一条

    计划。

    但是当我使用上面的sql 查询是 发下 以下结果

    sys.dm_exec_cached_plans :针对 SQL Server 为了加快查询执行而缓存的每个查询计划返回一行

    sys.dm_exec_query_stats:返回缓存查询计划的聚合性能统计信息。缓存计划中的每个查询语句在该视图中对应一行,并且行的生存期与计划本身相关联。

    为什么 使用sys.dm_exec_cached_plans 会出现4条但是用 sys.dm_exec_query_stats 只出现1条呢

    2012年3月5日 8:41

答案

  • 为什么会出现4个计划(第一行是你当前执行的计划,不算,),详见

    http://blogs.msdn.com/b/sqlprogrammability/archive/2007/01/11/4-0-query-parameterization.aspx

    简单的讲 ,sys.dm_exec_cached_plans中的2,3,4行的objtype为Adhoc  ,第5行的objtype为Prepared ,也就是参数化后的,

    2,3,4行Adhoc  对应的plan_handle 是假的,它只是一个SHELL,指向只是Prepared 对应的PLAN而已,而sys.dm_exec_query_stats中的那条记录正好对应sys.dm_exec_cached_plans中的第5条,这条才是真正被执行的PLAN,而sys.dm_exec_query_stats显示的就是这个真正的计划,其他3个SHELL plan不会在sys.dm_exec_query_stats中显示





    2012年3月5日 15:08

全部回复