查看历史执行计划

本文介绍如何查看Oracle数据库中已执行SQL语句的历史执行计划。如果执行计划仍在library cache中,可通过V$SQL_PLAN视图查询;若已从library cache移除,则需通过DBA_HIST_SQL_PLAN视图进行查询。
如果要查看过去历史真实的执行计划,而不是使用explain plan命令即时解析,需要查看相关视图。

如果当前执行计划仍然保存在library cache,则可以从v$sql_plan中看到。

点击(此处)折叠或打开

  1. SELECT plan_hash_value,
  2.        TO_CHAR(RAWTOHEX(child_address)),
           TO_NUMBER(child_number),
           id,
           LPAD(' ', DEPTH) || operation operation,
           options,
           object_owner,
           object_name,
           optimizer,
           cost,
           access_predicates,
           filter_predicates
      FROM V$SQL_PLAN
      where sql_id = 'abcd'
     ORDER BY 1, 3, 2, 4
黄色文字部分为sql_id

如果执行计划已经不在library cache中了,则需要去DBA_HIST_SQL_PLAN中寻找。

点击(此处)折叠或打开

  1. set linesize 500
  2. set pagesize 500
    col plan_hash_value format 9999999999
    col id format 999999
    col operation format a30
    col options format a15
    col object_owner format a15
    col object_name format a20
    col optimizer format a15
    col cost format 9999999999
    col access_predicates format a15
    col filter_predicates format a15

    SELECT plan_hash_value,
             id,
             LPAD (' ', DEPTH) || operation operation,
             options,
             object_owner,
             object_name,
             optimizer,
             cost,
             access_predicates,
             filter_predicates
       FROM dba_hist_sql_plan
       WHERE sql_id = 'fahv8x6ngrb50'
    ORDER BY plan_hash_value, id;

通常,在AWR中发现的可疑语句可以通过如上方式操作。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22621861/viewspace-2085396/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22621861/viewspace-2085396/

<think>嗯,用户问的是SQL Server中查看执行计划的方法。结合之前的引用内容,特别是引用[1]详细提到了动态管理视图和图形化执行计划,引用[2]提到统计信息影响执行计划选择,这些都是关键点。 用户可能是个DBA或开发人员,正在做SQL性能调优。ta需要具体的操作指引,最好包含多种查看方式。从ta提问的简洁性看,可能是个中级使用者,不需要太基础的概念解释,但要确保步骤清晰。 引用[4]和[5]提供了实际查询示例,特别是引用[4]的阻塞分析查询和引用[5]的历史SQL统计查询,都可以作为补充内容。不过用户当前焦点在执行计划查看,优先整理核心方法。 需要强调几个层面:图形化界面最直观适合初学者;文本执行计划可快速获取;XML格式适合深度分析;动态管理视图则用于监控历史执行计划。引用[1]提到的计划缓存机制和引用[2]的统计信息权重理论,应该作为原理补充。 考虑在回答中区分实时执行计划历史执行计划查看方式,因为引用[3]和[5]都涉及历史SQL分析。用户没明确场景,所以两种都要覆盖。 最后生成的参考问题要延伸性能调优方向,比如引用[2]提到的索引统计信息更新机制,以及引用[4]的阻塞分析,都是自然关联点。</think>在 SQL Server 中查看查询执行计划是进行性能调优的关键步骤。以下是几种主要方法,结合了图形化界面和代码命令: ### 📊 一、图形化执行计划 (SSMS) 1. **实际执行计划** (运行查询后查看) * 在 SSMS 查询窗口中输入 SQL 语句 * 点击工具栏 **`包含实际执行计划`** 图标 (或按 `Ctrl + M`) * 执行查询 (`F5`) * 结果下方出现 **`执行计划`** 标签页,显示查询实际使用的计划[^1] 2. **预估执行计划** (不运行查询) * 在 SSMS 查询窗口中输入 SQL 语句 * 点击工具栏 **`显示预估执行计划`** 图标 (或按 `Ctrl + L`) * 结果下方出现 **`执行计划`** 标签页,显示基于统计信息预估的计划[^1][^2] ### 📝 二、文本格式执行计划 ```sql -- 获取预估执行计划 (文本格式) SET SHOWPLAN_TEXT ON; GO SELECT * FROM YourTable WHERE YourColumn = 'Value'; -- 替换为你的查询 GO SET SHOWPLAN_TEXT OFF; GO -- 获取更详细预估计划 (文本格式) SET SHOWPLAN_ALL ON; GO SELECT * FROM YourTable WHERE YourColumn = 'Value'; GO SET SHOWPLAN_ALL OFF; GO ``` ### 📄 三、XML 格式执行计划 ```sql -- 获取预估执行计划 (XML格式) SET SHOWPLAN_XML ON; GO SELECT * FROM YourTable WHERE YourColumn = 'Value'; GO SET SHOWPLAN_XML OFF; GO -- 获取实际执行计划 (XML格式) SET STATISTICS XML ON; GO SELECT * FROM YourTable WHERE YourColumn = 'Value'; GO SET STATISTICS XML OFF; GO ``` ### 🔍 四、查看缓存中的执行计划 (DMV) ```sql -- 查询计划缓存中的执行计划 SELECT dest.text AS [SQL语句], deqp.query_plan AS [执行计划(XML)], deqs.execution_count AS [执行次数], deqs.total_logical_reads AS [逻辑读总数], deqs.total_elapsed_time AS [总耗时(微秒)] FROM sys.dm_exec_query_stats deqs CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) dest CROSS APPLY sys.dm_exec_query_plan(deqs.plan_handle) deqp WHERE dest.text LIKE '%YourTable%' -- 替换为你的表名或关键字 ORDER BY deqs.total_logical_reads DESC; ``` > 说明:此方法可查看历史执行计划及统计信息[^1][^3][^5] ### 📌 关键点说明 1. **实际 vs 预估计划**: * 实际计划包含运行时指标(如实际行数) * 预估计划基于统计信息生成[^2] 2. **执行计划元素**: * 运算符图标(扫描、查找、连接等) * 箭头粗细(数据流大小) * 成本百分比(每个步骤的相对开销) * 工具提示(鼠标悬停查看详细信息) 3. **统计信息重要性**: * SQL Server 基于统计信息计算成本权重 * 过时统计信息会导致低效计划[^2] ### ⚠️ 注意事项 * 生产环境慎用 `SET STATISTICS XML ON`,可能影响性能 * 定期更新统计信息:`UPDATE STATISTICS YourTable` * 复杂查询可保存执行计划(.sqlplan 文件)用于后续分析 > 图形化界面最适合初学者分析,而DMV查询则便于监控历史执行情况[^1][^5]。执行计划中的 **`逻辑读次数`** 和 **`预估/实际行数差异`** 是优化关键指标[^4][^5]。 --- ### 🔍 相关问题 1. **如何解读执行计划中的表扫描(Table Scan)和索引查找(Index Seek)?** > 表扫描通常意味着缺少有效索引,而索引查找表明索引被有效利用。两者成本差异可达100倍以上[^2]。 2. **为什么实际执行计划与预估计划不同?如何解决?** > 常见于统计信息过时或参数嗅探问题。可通过更新统计信息或使用`OPTION(RECOMPILE)`解决[^2][^4]。 3. **如何识别执行计划中的关键性能瓶颈?** > 重点关注:成本超过30%的操作符、红色警告图标(缺失索引)、实际/预估行数差异超过10倍的操作[^1][^4]。 4. **动态管理视图(DMV)还能获取哪些执行计划相关信息?** > 可获取历史执行次数、CPU耗时、物理读等指标,通过`sys.dm_exec_query_stats`和`sys.dm_exec_procedure_stats`分析[^3][^5]。 5. **执行计划中出现`Key Lookup`运算符意味着什么?如何优化?** > 表示非聚集索引未覆盖查询列,可通过创建包含列(included columns)的索引解决,避免回表查询[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值