能否有人请您解释一下解释计划,以及如何获得查询的解释计划。另外,如果有任何可用作该实用程序的sql脚本,那将是很好的。
能否有人请您解释一下解释计划,以及如何获得查询的解释计划。另外,如果有任何可用作该实用程序的sql脚本,那将是很好的。
Answers:
您可以使用软件包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
这是一个非常常见的问题,所以我决定将这个答案变成一篇文章。
估计的执行计划是由优化器生成的,而不执行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格式设置选项,您可以获取比使用默认格式设置选项更多的有关估计执行计划的详细信息。
如果已安装SQL Developer,则无需添加EXPLAIN PLAN FOR命令即可轻松获得任何SQL查询的估计执行计划:
实际的SQL执行计划是由优化器在运行SQL查询时生成的。因此,与估计的执行计划不同,您需要执行SQL查询以获取其实际执行计划。
只要表统计信息已由基础关系数据库正确收集,实际计划就不会与估计计划有显着差异。
要指示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_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'