通过10046 event来获取真实的执行计划

本文深入探讨了在Oracle数据库中获取准确SQL执行计划的方法,包括使用AUTOTRACE和10046事件的技巧,以及如何解读这些计划以优化查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 获取SQL执行计划的方式有很多,但是某些时候获取的SQL执行计划并不是准确的,只有在SQL真实执行之后获取到的SQL PLAN才是真实准确的,其他方式(如,explain plan)获取到的执行计划都有可能因为绑定绑定变量和当时SQL执行环境的影响而导致获取到的执行计划可能不准确。对于AUTOTRACE开关,当执行SET AUTOT ONSET AUTOT TRACE命令此时的SQL是实际执行过的,所以此时获取到的执行计划是准确的。而SET AUTOT TRACE EXP命令时稍有不同,当执行的是SELECT语句时SQL语句并不会实际执行,此时获取到的执行计划和直接使用explain plan命令获取的结果是一致的,但是对于DML命令则会实际执行该SQL。

 下面看一个例子,说明SET AUTOT TRACE EXP并不会真实的执行SELECT语句,以此为例来介绍如何确定SQL是否真实执行。
 首先,我们直接执行SQL,可以在V$SQLAREA里看到EXECUTIONS的值为1。

SQL> SELECT PCT_USED,PCT_FREE FROM TEST_ENV.TB_TABLE_LIST WHERE TABLE_NAME='DBMS_SQLPATCH_STATE';

  PCT_USED   PCT_FREE
---------- ----------
        40         10

SQL> SELECT EXECUTIONS FROM V$SQLAREA WHERE SQL_TEXT LIKE 'SELECT PCT_USED,PCT_FREE FROM TEST_%';

EXECUTIONS
----------
         1

SQL> ALTER SYSTEM FLUSH SHARED_POOL;--该操作为了方便后面查询,生产环境勿执行

系统已更改。

 打开SET AUTOT TRACE EXP,后重复上述SQL,可以看到EXECUTIONS的值为0,表明SQL并没有真实执行。

SQL> SET AUTOT TRACE EXP
SQL> SELECT PCT_USED,PCT_FREE FROM TEST_ENV.TB_TABLE_LIST WHERE TABLE_NAME='DBMS_SQLPATCH_STATE';

执行计划
----------------------------------------------------------
Plan hash value: 3473397811

----------------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name                     | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                          |     1 |    23 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| TB_TABLE_LIST            |     1 |    23 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | IDX_TB_TABLE_LIST_TBNAME |     1 |       |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("TABLE_NAME"='DBMS_SQLPATCH_STATE')

SQL> SET AUTOTRACE OFF
SQL> SELECT EXECUTIONS FROM V$SQLAREA WHERE SQL_TEXT LIKE 'SELECT PCT_USED,PCT_FREE FROM TEST_%';

EXECUTIONS
----------
         0

 另一种获取SQL真实执行计划的方式是通过10046事件,通过这种方式我们可以看到更细粒度的结果展示,如每一个步骤所执行的逻辑读、物理读和花费的时间等,这对于某些复杂SQL诊断时会比较有用。

什么是10046事件?

 10046 event是ORACLE提供的一个性能分析工具,可以用来跟踪某一个session所执行的SQL语句或者或者PL/SQL语句各个阶段中遇到的等待事件、消耗的逻辑读、物理读、消耗的时间、执行计划等。
 10046 event有以下9个有效跟踪级别:

  1. level 1 启用标准SQL_TRACE的功能,包含时间消耗、处理的行数,物理读和写的数、执行计划等
  2. level 4 在level 1 的基础上多了变量绑定
  3. level 8 在level 1 的基础上多了等待事件
  4. level 12 即level 4+level 8
  5. level 16 level 1的基础上为每一次执行生成执行计划信息(11.1之后的版本才有)
  6. level 28 level 4+level 8+level 16
  7. level 32 比level 1少了执行计划信息(11.1之后的版本才有)
  8. level 64 在level 1的基础上,如果某游标比上次执行的时间多消耗了1min以上则还会生成执行计划信息(11.2之后的版本才有)
  9. level 68 即leve4 + level 64
如何使用?

通过以下三个步骤我们可以通过10046 event来获取执行计划:

  1. 在当前session激活10046 event,有以下两种方式:

alter session set events ‘10046 trace name context forever,level 12’
oradebug setmypid
oradebug event 10046 trace name context forever,level 12

  1. 执行目标SQL
  2. 在当前session关闭10046 event:

alter session set events ‘10046 trace name context off’
oradebug event 10046 trace name context off

 推荐使用oradebug的方式,这样可以通过oradebug tracefile_name来获取tracefile的绝对路径。对于直接获取到的tracefile不直观,看起来非常吃力,可以通过ORACLE提供的tkprof来对得到的trace文件进行翻译

案例操作
SQL> oradebug setmypid
已处理的语句
SQL> oradebug event 10046 trace name context forever,level 12
已处理的语句

SQL> select a.table_name,a.pct_used,b.column_name from test_env.tb_table_list a,test_env.tb_column_list b
     where a.owner=b.owner
     and a.table_name=b.table_name
     and b.table_name='DBMS_SQLPATCH_STATE';

.
.
.
.
DBMS_SQLPATCH_STATE     40   S_CACHED_LSINVENTORY


已选择 27 行。

SQL> oradebug tracefile_name
C:\APP\ADMINISTRATOR\diag\rdbms\orcl\orcl\trace\orcl_ora_3016.trc
SQL> oradebug event 10046 trace name context off
已处理的语句
SQL>


C:\Users\Administrator>tkprof C:\APP\ADMINISTRATOR\diag\rdbms\orcl\orcl\trace\orcl_ora_2548.trc C:\explain_orcl_ora_2548.txt

TKPROF: Release 18.0.0.0.0 - Development on 星期五 4月 5 16:05:18 2019

Copyright (c) 1982, 2018, Oracle and/or its affiliates.  All rights reserved.

翻译后的结果如下:

********************************************************************************

select a.table_name,a.pct_used,b.column_name from test_env.tb_table_list a,test_env.tb_column_list b
where a.owner=b.owner
and a.table_name=b.table_name
and b.table_name='DBMS_SQLPATCH_STATE'

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        3      0.01       0.07        856        863          0          27
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        5      0.03       0.08        856        863          0          27

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: SYS
Number of plan statistics captured: 1

Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
        27         27         27  HASH JOIN  (cr=863 pr=856 pw=0 time=78538 us starts=1 cost=246 size=63 card=1)
         1          1          1   TABLE ACCESS FULL TB_TABLE_LIST (cr=101 pr=99 pw=0 time=23646 us starts=1 cost=31 size=26 card=1)
        27         27         27   TABLE ACCESS FULL TB_COLUMN_LIST (cr=762 pr=757 pw=0 time=42700 us starts=1 cost=214 size=444 card=12)


Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  Disk file operations I/O                        2        0.00          0.00
  SQL*Net message to client                       3        0.00          0.00
  db file sequential read                         2        0.01          0.01
  db file scattered read                         36        0.01          0.04
  SQL*Net message from client                     3        6.98          7.06
  PGA memory operation                            1        0.00          0.00



********************************************************************************

OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        3      0.01       0.07        856        863          0          27
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        5      0.03       0.08        856        863          0          27

Misses in library cache during parse: 1

Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                       6        0.00          0.00
  SQL*Net message from client                     6       80.00        104.95
  db file sequential read                         2        0.01          0.01
  PGA memory operation                            1        0.00          0.00
  Disk file operations I/O                        5        0.00          0.00
  db file scattered read                         36        0.01          0.04


OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        2      0.01       0.00          0          0          0           0
Execute    124      0.01       0.04          0          0          0           0
Fetch      233      0.01       0.04         10        399          0         422
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total      359      0.04       0.08         10        399          0         422

Misses in library cache during parse: 2
Misses in library cache during execute: 15

Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  db file sequential read                        10        0.00          0.04
  PGA memory operation                            7        0.00          0.00
  Disk file operations I/O                        1        0.00          0.00

    1  user  SQL statements in session.
   19  internal SQL statements in session.
   20  SQL statements in session.
********************************************************************************
Trace file: C:\APP\ADMINISTRATOR\diag\rdbms\orcl\orcl\trace\orcl_ora_2548.trc
Trace file compatibility: 12.2.0.0
Sort options: default

       1  session in tracefile.
       1  user  SQL statements in trace file.
      19  internal SQL statements in trace file.
      20  SQL statements in trace file.
      20  unique SQL statements in trace file.
    2176  lines in trace file.
       0  elapsed seconds in trace file.

 从结果中可以看到SQL的执行计划、每个阶段(Parse、Execute、Fetch)cpu时间返回的行数、所涉及等待事件、row source操作的具体情况等详细的信息。当我们通过AUTOTRACE以及DBMS_XPLAN方式无法确定SQL具体性能问题时,10046可以让我们获取到更多详细信息来定位相关性能问题。

<think>首先,用户的问题是关于SQLServer2016的:如何查看和分析执行计划优化查询性能。我需要根据系统级指令来构建回答。系统级指令: -所有行内数学表达式必须使用$...$格式。 -独立公式必须使用$$...$$格式并单独成段。- LaTeX语法正确。-使用中文回答。-生成相关问题。 -回答中引用的段落末尾自然地添加引用标识。-回答结构清晰,帮助用户逐步解决问题,保证回答真实可靠。 用户的问题是关于SQL Server2016的执行计划,所以我需要从提供的引用中提取相关信息。引用[1]、[2]、[3]都与SQLServer的执行计划相关。引用内容: -[^1]:讨论SQLServer查询执行计划的基础知识,以及如何查看计划,包括实际的和估计的方法。 -[^2]:介绍如何查看执行计划的不同类型和格式,包括SET SHOWPLAN_TEXT, SETSHOWPLAN_ALL,SET SHOWPLAN_XML,以及图形执行计划。- [^3]:列出在SQL Server2016及以后版本中查看实际执行计划的方法,包括使用扩展事件(XE)、跟踪标志、SQL跟踪、Profiler、SETSTATISTICS XMLON等。 用户指定了SQLServer2016,所以我需要专注于2016版本的方法。关键点:-在SQLServer2016中,查看执行计划的方法包括:-使用SET SHOWPLAN_XML ON或SET STATISTICSXML ON来获取XML格式的执行计划。-使用SQL ServerManagement Studio(SSMS)查看图形执行计划。-使用扩展事件(XE)会话,如query_post_execution_showplan。-从SQL Server2016 SP1开始,可以使用跟踪标志7412来启用轻量级分析。-其他方法如SQLProfiler(但注意Profiler在较新版本中不推荐使用)。 用户想优化查询性能,所以我需要解释如何分析执行计划来识别瓶颈。 回答结构:1.**介绍执行计划的重要性**:简要解释执行计划是什么,为什么它对优化查询性能关键。 2. **查看执行计划的方法**:详细描述在SQLServer2016中如何获取执行计划。-估计执行计划-实际执行计划3. **分析执行计划**:解释如何阅读和理解执行计划,以识别性能问题。4.**优化建议**:基于分析提供一些优化提示。 5. **生成相关问题**:在末尾添加相关问题。 引用标识:在回答中引用段落时,末尾添加[^1]、[^2]、[^3]。例如,如果提到基础知识,引用[^1]。使用中文:整个回答必须用中文。 生成相关问题:在末尾添加类似示例中的“相关问题”部分。数学表达式:用户的问题不涉及数学,但如果有,比如在解释成本估算时,可能需要使用LaTeX。例如,如果讨论成本模型,可以说成本计算公式为$cost= ...$。但在这个上下文中,可能不需要,除非必要。确保真实可靠:基于我的知识,SQL Server执行计划查看方法包括:-在SSMS中,点击“显示估计执行计划”按钮。-使用SETSTATISTICSXML ON。 -使用扩展事件。 从引用[3]: -对于实际执行计划:SETSTATISTICS XMLON,或使用XE会话query_post_execution_showplan。 -在SQL Server2016 SP1,可以使用跟踪标志7412。步骤:1.**查看估计执行计划**:在查询前使用SET SHOWPLAN_XML ON,或SSMS图形界面。2.**查看实际执行计划**:在查询后使用SETSTATISTICS XMLON,或SSMS中启用“包括实际执行计划”。 3. **分析**:查看操作符、成本、行数等,识别高成本操作、缺失索引等。 在回答中:-使用标题或小标题使结构清晰。 -逐步指导用户。 -添加引用。相关问题:例如: 1.如何解释执行计划中的操作符?2.SQL Server2016中优化查询的其他方法?3.如何创建索引以提高性能?最后,确保回答完整。</think>### SQL Server 2016 中查看和分析执行计划优化查询性能 在 SQL Server 2016 中,执行计划优化查询性能的关键工具。它展示了查询优化器如何执行 SQL 语句,包括操作步骤、资源消耗(如 CPU 和 I/O)和成本估算。通过分析执行计划,您可以识别瓶颈(如全表扫描或高成本操作),并采取优化措施(如添加索引或重写查询)。以下我将逐步指导您如何查看和分析执行计划,确保方法适用于 SQL Server 2016 版本。 #### 步骤 1: 查看执行计划的方法 在 SQL Server 2016 中,执行计划分为“估计执行计划”(基于统计信息预测)和“实际执行计划”(真实执行后的结果)。优先使用实际执行计划进行性能优化,因为它反映真实运行时行为。 - **估计执行计划**(无需执行查询): - **图形界面方法**:在 SQL Server Management Studio (SSMS) 中,打开查询窗口,输入您的 SQL 语句,然后点击工具栏上的“显示估计执行计划”按钮(图标类似一个图表)。SSMS 会生成一个可视化的流程图,显示操作符(如索引扫描、排序)和预估成本[^1]。 - **命令行方法**:在查询前使用 T-SQL 命令。例如: ```sql SET SHOWPLAN_XML ON; -- 开启 XML 格式输出 GO SELECT * FROM YourTable WHERE Condition; -- 您的查询 GO SET SHOWPLAN_XML OFF; -- 关闭输出 ``` 结果会以 XML 格式返回,您可以在 SSMS 中点击链接查看图形化计划。XML 格式便于深入分析,因为它包含详细元数据[^2]。 - **实际执行计划**(需执行查询): - **图形界面方法**:在 SSMS 中,执行查询前勾选“包括实际执行计划”按钮(图标带有一个“播放”符号)。运行查询后,结果下方会显示一个“执行计划”标签页,包含实际执行流程图。 - **命令行方法**:使用 `SET STATISTICS XML ON` 获取实际执行计划: ```sql SET STATISTICS XML ON; -- 开启实际计划输出 GO SELECT * FROM YourTable WHERE Condition; -- 您的查询 GO SET STATISTICS XML OFF; -- 关闭输出 ``` 输出同样是 XML 格式,可点击查看图形化视图。此方法从 SQL Server 2000 开始支持,在 2016 中仍然有效[^3]。 - **高级方法**:对于复杂场景,使用扩展事件 (XE) 会话: - 创建 XE 会话捕获 `query_post_execution_showplan` 事件(适用于 SQL Server 2012 及以后,包括 2016)。 - 示例脚本: ```sql CREATE EVENT SESSION [CaptureExecutionPlan] ON SERVER ADD EVENT sqlserver.query_post_execution_showplan ADD TARGET package0.event_file(SET filename=N'C:\YourPath\Plan.xel') GO ALTER EVENT SESSION [CaptureExecutionPlan] ON SERVER STATE = START; -- 启动会话 ``` 执行您的查询后,通过 SSMS 的“扩展事件”工具查看捕获的计划。此方法适用于生产环境,开销较低[^3]。 **注意事项**: - SQL Server 2016 SP1 引入了轻量级分析选项(通过跟踪标志 7412),但一般优先使用上述标准方法。 - 避免使用 SQL Profiler(已不推荐),因为它可能增加服务器负载。 - 所有方法都可在 SSMS 2016 或更高版本中使用(确保 SSMS 更新到最新版)。 #### 步骤 2: 分析执行计划优化性能 获取执行计划后,分析核心元素以识别问题。以下是关键分析步骤: 1. **理解操作符**:执行计划由多个操作符组成(如 `Index Scan`、`Hash Match`、`Sort`)。每个操作符代表一个物理操作: - 高成本操作符:关注成本百分比高的节点(通常在图形计划中显示为红色或黄色)。例如: - `Table Scan` 或 `Index Scan` 表示全表扫描,成本高,可能需添加索引。 - `Sort` 或 `Hash Join` 可能指示内存压力,需优化查询逻辑。 - 成本计算公式可简化为 $cost = \text{CPU开销} + \text{I/O开销}$,其中成本值以相对单位表示(非实际时间)。优化目标是减少总成本[^1]。 2. **检查关键指标**: - **预估行数 vs. 实际行数**:在“实际执行计划”中,比较“Estimated Number of Rows”和“Actual Number of Rows”。如果差异大(如预估 100 行,实际 10,000 行),表示统计信息过时,需更新(使用 `UPDATE STATISTICS YourTable`)。 - **开销百分比**:每个操作符的开销百分比应均衡。高开销节点(>30%)通常是优化重点。 - 其他指标:如“内存授予”和“I/O 读取”,在属性窗口(右键点击操作符)中查看。高 I/O 可能指示索引缺失。 3. **识别常见问题及优化建议**: - **缺失索引**:如果计划显示“Missing Index”警告(在图形计划中提示),创建推荐索引。例如: ```sql CREATE NONCLUSTERED INDEX [IX_YourIndex] ON YourTable (Column1, Column2); ``` - **参数嗅探问题**:如果查询使用变量,执行计划可能不优化,尝试使用 `OPTION (RECOMPILE)`。 - **资源瓶颈**:高 CPU 或内存操作可优化查询逻辑(如避免 `SELECT *`,改用具体列)。 4. **使用工具辅助**: - 在 SSMS 中,右键执行计划选择“查看属性”获取详细数据。 - 对于 XML 计划,导出为 `.sqlplan` 文件并用 SSMS 打开,便于共享和分析。 - 参考 SQL Server 文档或内置报告(如“性能仪表板”)进行深入分析[^2]。 #### 最佳实践 - **测试环境优先**:在生产环境前,在测试库中分析计划,避免影响性能。 - **定期更新统计信息**:确保优化器有准确数据,运行 `sp_updatestats` 定期。 - **结合其他工具**:使用 `SET STATISTICS IO ON` 和 `SET STATISTICS TIME ON` 补充 I/O 和时间指标。 - 如果分析后性能未改善,考虑查询重写或索引调整向导(SSMS 内置功能)。 通过以上步骤,您可以系统地优化查询。例如,一个常见案例是:通过添加索引,将 `Table Scan` 替换为 `Index Seek`,成本从 80% 降至 10%,显著提升速度[^1]。 #### 相关问题 1. 如何解释 SQL Server 执行计划中的不同操作符(如 Scan vs. Seek)? 2. SQL Server 2016 中如何更新统计信息以优化查询性能? 3. 除了执行计划,还有哪些工具可用于 SQL Server 查询优化(如 DMV 或 Query Store)? [^1]: SQL Server 查询执行计划是性能分析的基础,涵盖查看方法包括实际和估计计划。 [^2]: 查看执行计划涉及多种格式,如 SET SHOWPLAN_XML 和图形界面,便于分析不同组件。 [^3]: 在 SQL Server 2016 中,实际执行计划可通过 SET STATISTICS XML ON 或扩展事件会话捕获。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值