前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >获取SQL执行计划最基础的方法是啥?

获取SQL执行计划最基础的方法是啥?

作者头像
SQLplusDB
发布2020-11-12 10:43:46
5240
发布2020-11-12 10:43:46
举报

出品丨TeacherWhat

关键字:Oracle、SQL、调优、诊断、手把手数据库入门、Database、Explain

正文约4500字,建议阅读时间6分钟

目录结构:

1. 使用EXPLAIN PLAN命令的准备

2. EXPLAIN PLAN FOR命令的使用方法

3. 查看EXPLAIN PLAN生成的执行计划

4. EXPLAIN PLAN使用例

5. 注意事项

6. 本文要点&思考

本公众号文章仅代表个人观点,与任何公司无关。

其他系列文章:SQL调优和诊断从哪入手?

使用EXPLAIN PLAN命令

获取执行计划最基础的方法是使用EXPLAIN PLAN命令。 通过EXPLAIN PLAN命令,可以不实际执行SQL的前提下,查看某条SQL根据统计信息生成的执行计划。

使用EXPLAIN PLAN命令的准备

要使用EXPLAIN PLAN命令,需要首先创建执行计划表PLAN_TABLE 。 这样通过EXPLAIN PLAN命令生成的执行计划会保存在表PLAN_TABLE 中。

一般情况下,执行计划表PLAN_TABLE是已经默认创建好的,也可以根据需要手动创建。

创建方法如下:

代码语言:javascript
复制
--10G之前的版本执行以下脚本
SQL> @@?/rdbms/admin/utlxplan

--10G以后的版本执行以下脚本
SQL> @@?/rdbms/admin/catplan

EXPLAIN PLAN FOR命令的使用方法

EXPLAIN PLAN FOR命令的语法如下:

▲引用自Database SQL Language Reference

例:SQL> explain plan for <SQL语句>

参考:

代码语言:javascript
复制
Database SQL Language Reference
https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/EXPLAIN-PLAN.html#GUID-FD540872-4ED3-4936-96A2-362539931BA0

查看EXPLAIN PLAN生成的执行计划

EXPLAIN PLAN FOR命令执行后,可以通过以下方式查看生成的执行计划。

代码语言:javascript
复制
1 utlxpls.sql脚本
显示一般串行处理的执行计划。
SQL> @@?/rdbms/admin/utlxpls.sql

2 utlxplp.sql脚本
显示并行处理的执行计划。
@@?/rdbms/admin/utlxplp.sql

3 DBMS_XPLAN.DISPLAY包

3.1
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());

3.2 
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE',NULL,'ALL'));

4 通过指定statement_id,直接查询PLAN_TABLE表。

SELECT cardinality "Rows",
lpad(' ',level-1)||operation||' '||options||' '||object_name "Plan"
FROM PLAN_TABLE
CONNECT BY prior id = parent_id
AND prior statement_id = statement_id
START WITH id = 0
AND statement_id = '<指定的statement_id >'
ORDER BY id;

EXPLAIN PLAN使用例

以下时EXPLAIN PLAN的使用例

代码语言:javascript
复制
--执行SQL
SQL> explain plan for
 select * from dual;  2

Explained.

---1.通过utlxpls.sql脚本显示执行计划
SQL> @@?/rdbms/admin/utlxpls.sql

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 272002086

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

8 rows selected.

--2.通过utlxplp.sql脚本显示执行计划
SQL> @@?/rdbms/admin/utlxplp.sql

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 272002086

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

8 rows selected.


--3.1 通过DBMS_XPLAN.DISPLAY()显示执行计划
SQL> SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 272002086

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

8 rows selected.

--3.2 通过DBMS_XPLAN.DISPLAY()显示执行计划
SQL> SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE',NULL,'ALL'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 272002086

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

   1 - SEL$1 / DUAL@SEL$1

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "DUAL"."DUMMY"[VARCHAR2,1]

18 rows selected.

通过指定的statement_id,直接查询PLAN_TABLE表

代码语言:javascript
复制
--执行SQL
SQL> explain plan set statement_id = 'test' for
 select * from dual;  2

Explained.

--查询PLAN_TABLE表查看执行计划
SQL> set linesize 200
SQL> col Plan format a80
SQL> SELECT cardinality "Rows",
  2  lpad(' ',level-1)||operation||' '||options||' '||object_name "Plan"
FROM PLAN_TABLE
  3    4  CONNECT BY prior id = parent_id
AND prior statement_id = statement_id
  5    6  START WITH id = 0
  7  AND statement_id = 'test'
ORDER BY id;
  8
      Rows Plan
---------- --------------------------------------------------------------------------------
         1 SELECT STATEMENT
         1  TABLE ACCESS FULL DUAL

注意事项

EXPLAIN PLAN命令能够在不真正执行SQL的前提下获取执行计划,从而在最小的系统影响的前提下,帮助我们进行SQL调优和诊断。 但是,EXPLAIN PLAN命令得到的是根据各种统计信息预估的执行计划,可能和实际执行时的执行计划不同。例如:包含绑定的SQL文 或者 在版本12c上,由于自适应执行计划(Adaptive Execution Plans)的影响等,EXPLAIN PLAN命令并不能反映出实际的执行计划。

其他详细请参考在线文档:

代码语言:javascript
复制
Database SQL Language Reference
https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/EXPLAIN-PLAN.html#GUID-FD540872-4ED3-4936-96A2-362539931BA0

本文要点

本文介绍了Oracle中获取执行计划最基础的方法,EXPLAIN PLAN命令。

思考

除了EXPLAIN PLAN命令,你常用的还有哪些获取执行计划的方法?各种方法的优缺点是什么?

——End——

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Oracle数据库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用EXPLAIN PLAN命令
    • 使用EXPLAIN PLAN命令的准备
      • EXPLAIN PLAN FOR命令的使用方法
        • 查看EXPLAIN PLAN生成的执行计划
          • EXPLAIN PLAN使用例
            • 注意事项
              • 本文要点
                • 思考
                相关产品与服务
                数据库
                云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档