您如何获得解释计划?


10

能否有人请您解释一下解释计划,以及如何获得查询的解释计划。另外,如果有任何可用作该实用程序的sql脚本,那将是很好的。


1
“如果有任何可用作该实用程序的sql脚本”,您正在寻找哪种类型的实用程序?
德里克·唐尼

2
许多SQL开发工具都具有非常易于使用的GUI来获取执行计划。Oracle SQL Developer有一个。您是否可以使用任何此类工具,或者您是否特别想通过脚本执行此操作?
FrustratedWithFormsDesigner 2012年

我确实有Oracle SQL Developer,但想了解脚本。
user419534

2
如果您已经完成了Jonathan Lewis的课程,那么您将知道有8种不同的方法可以从Oracle中提取执行计划。如果您希望我添加列出所有不同方法的答案,请对此评论加注。
柯林·哈特

Answers:


9

您可以使用软件包DBMS_XPLAN

SQL> explain plan for select * from dual;

Explained

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |     1 |     2 |     2 |
|   1 |  TABLE ACCESS FULL   | DUAL        |     1 |     2 |     2 |
--------------------------------------------------------------------
Note: cpu costing is off

5

EXPLAIN PLAN语句显示优化程序为SELECT,UPDATE,INSERT和DELETE语句选择的执行计划。语句执行计划是数据库为运行语句而执行的一系列操作。

EXPLAIN PLAN FOR ...

将...替换为您的SQL语句。运行此命令后,运行以下命令以查看计划:

SELECT * FROM table(dbms_xplan.display);

有关更多信息,请参见《Oracle 11g性能调优指南》中的“ 概述”或“ 用法”部分。


1

这是一个非常常见的问题,所以我决定将这个答案变成一篇文章

估计的SQL执行计划

估计的执行计划是由优化器生成的,而不执行SQL查询。您可以使用EXPLAIN PLAN FOR从任何SQL客户端生成估计的执行计划,也可以将Oracle SQL Developer用于此任务。

解释计划

使用Oracle时,如果将EXPLAIN PLAN FOR命令添加到给定的SQL查询之前,则数据库会将估计的执行计划存储在关联的中PLAN_TABLE

EXPLAIN PLAN FOR
SELECT p.id
FROM post p
WHERE EXISTS (
  SELECT 1
  FROM post_comment pc
  WHERE
    pc.post_id = p.id AND
    pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

要查看估计的执行计划,您需要使用DBMS_XPLAN.DISPLAY,如以下示例所示:

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'))

通过使用ALL + OUTLINE格式设置选项,您可以获取比使用默认格式设置选项更多的有关估计执行计划的详细信息。

Oracle SQL开发人员

如果已安装SQL Developer,则无需添加EXPLAIN PLAN FOR命令即可轻松获得任何SQL查询的估计执行计划:

在此处输入图片说明

实际的SQL执行计划

实际的SQL执行计划是由优化器在运行SQL查询时生成的。因此,与估计的执行计划不同,您需要执行SQL查询以获取其实际执行计划。

只要表统计信息已由基础关系数据库正确收集,实际计划就不会与估计计划有显着差异。

GATHER_PLAN_STATISTICS查询提示

要指示Oracle存储给定SQL查询的实际执行计划,可以使用GATHER_PLAN_STATISTICS查询提示:

SELECT /*+ GATHER_PLAN_STATISTICS */
  p.id
FROM post p
WHERE EXISTS (
  SELECT 1
  FROM post_comment pc
  WHERE
    pc.post_id = p.id AND
    pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

要可视化实际的执行计划,可以使用DBMS_XPLAN.DISPLAY_CURSOR

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST ALL +OUTLINE'))

在数据库连接级别启用STATISTICS

如果要获取给定会话中生成的所有查询的执行计划,可以将会话STATISTICS_LEVEL配置设置为ALL:

ALTER SESSION SET STATISTICS_LEVEL='ALL'

这与GATHER_PLAN_STATISTICS在每个执行查询上设置查询提示的效果相同。因此,就像GATHER_PLAN_STATISTICS查询提示一样,您可以DBMS_XPLAN.DISPLAY_CURSOR用来查看实际的执行计划。

STATISTICS_LEVEL收集完您感兴趣的执行计划后,应该将设置重置为默认模式。这非常重要,尤其是在使用连接池并且数据库连接可以重用的情况下。

ALTER SESSION SET STATISTICS_LEVEL='TYPICAL'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.