sqlserver缓存计划和得到的实际的执行计划一样吗?
还是跟预估的执行计划一样?
缓存计划
select * 
from sys.dm_exec_cached_plans 
cross apply sys.dm_exec_sql_text(plan_handle) 
cross apply sys.dm_exec_query_plan(plan_handle)普通的预估执行计划和实际执行计划是在SSMS工具里通过点上面一排的按钮查询出来请高手解答!

解决方案 »

  1.   

    http://www.cnblogs.com/tylerdonet/archive/2011/11/17/2253090.html
      

  2.   

    我找了一下微软的文档:sys.dm_exec_text_query_plan
    http://msdn.microsoft.com/zh-cn/library/windowsazure/hh977104.aspxquery_plan
    nvarchar(max)
    包含使用 plan_handle 指定的查询执行计划的编译时显示计划表示形式。显示计划采用文本格式。为包含即席 Transact-SQL 语句、存储过程调用以及用户定义函数调用等内容的每个批处理生成一个计划。
    此列可为空值。
      

  3.   

    看着解释,应该是实际运行中生成的执行计划sys.dm_exec_text_query_plan (Transact-SQL)
    http://msdn.microsoft.com/zh-CN/library/bb326654(v=sql.120).aspx
      

  4.   

    Once the optimizer arrives at an execution plan, the estimated plan is created and stored 
    in a memory space known as the plan cache 
      

  5.   

    试了几个,好像确实是预估执行计划,但为什么在我sql文执行完了后查看缓存计划,还是得到的是预估的计划呢?
      

  6.   

    http://dba.stackexchange.com/questions/44111/why-does-the-plan-cache-contain-estimated-and-not-actual-execution-plans这里说是预估的
      

  7.   

    http://social.msdn.microsoft.com/Forums/sqlserver/en-US/dd6536a0-9853-4dbb-ab56-e6f8b7ffad13/is-sysdmexecqueryplan-dmf-returns-estimated-execution-plan-or-actual-execution-plan-?forum=sqldatabaseengine
      

  8.   

    estimated Number of Rows是有值的,除了这个看哪个?
    倒是发现实际的里面有degree of palallelism。而缓存计划和预估计划里是都没有这个的
      

  9.   

    plan cache里面会存最多两个执行计划,其中一个就是并行执行计划。这个是执行的时候生成的,所以准确来说,plan cache也的确不仅仅存预估执行计划。另外如果没有实际影响行数,证明这个执行计划不是实际执行计划,你可以把查询拿出来直接执行然后看实际执行计划,是有实际影响行数的,而预估是没有这项
      

  10.   

    你好,看了下实际执行计划,也没看到有实际影响行数啊。只有estimated Number of Rows这一项,但这个预估的和缓存里面也都有。
      

  11.   

    看到了,确实的,缓存计划里面没有这个。谢谢谢谢。另外,那如果我想要通过程序的方式取到实际执行计划,有什么好的办法吗?
    如果用SET STATISTICS XML ON的话,取到执行计划的同时,SQL文的返回的结果也会一并返回回来。
    我只想要干净的实际执行计划XML。
      

  12.   

    其实性能优化的时候,绝大部分分析的还是缓存中的执行计划,而且SQL语句不返回,有时候分析起来相当费劲
      

  13.   

    返回缓存中的执行计划现在已经实现了,但由于有的时候因为不同的参数返回不同的结果,尤其是在存储过程有if elseif的时候,缓存计划会返回两者的计划,但实际计划只返回实际用到的那个if里面的计划。
    所以很多时候需要看实际计划,所以还是想知道取实际执行计划的好方法。
      

  14.   

    那这个可能要单独获取,或者用sql trace,缓存中的执行计划用来“侦测”,定位有问题之后再对应分析
      

  15.   

    返回缓存中的执行计划现在已经实现了,但由于有的时候因为不同的参数返回不同的结果,尤其是在存储过程有if elseif的时候,缓存计划会返回两者的计划,但实际计划只返回实际用到的那个if里面的计划。
    所以很多时候需要看实际计划,所以还是想知道取实际执行计划的好方法。你想想如果有多个IF/ELSE,如果缓存存了,不就有很多个执行计划咯,而且你要查的时候也不现实啊,哪知道哪个对应哪个
      

  16.   

    执行计划只出执行了的SQL部分的计划。
    有什么好办法取实际执行计划吗(不带返回结果)?
      

  17.   

    实际执行计划必然带有SQL语句的
      

  18.   

    我有多个SQL文,想批量获取实际执行计划,没有办法吗?
      

  19.   

    你是说一个sql语句产生的多个执行计划还是???
      

  20.   

    不是,多个SQL语句啊,不想手动的在SSMS中执行,然后一个个地取执行计划,想通过写脚本直接把实际的执行计划给抽出来。
      

  21.   

    那只能用set showplan那些,或者用sql trace
      

  22.   

    不是,多个SQL语句啊,不想手动的在SSMS中执行,然后一个个地取执行计划,想通过写脚本直接把实际的执行计划给抽出来。哦,你要这些执行计划,有什么特殊用途?