use*_*640 13 oracle sqlplus sql-execution-plan
我正在学习数据库索引,我正在努力了解使用它们的有效性.
我正在使用sql +.
我如何查看执行计划,我在哪里可以找到告诉我我的索引是否被使用的信息?
Bir*_*ash 24
尝试使用此代码首先解释然后查看计划:
解释计划:
explain plan
for
select * from table_name where ...;
Run Code Online (Sandbox Code Playgroud)
看计划:
select * from table(dbms_xplan.display);
Run Code Online (Sandbox Code Playgroud)
编辑:删除括号
估计的执行计划由优化器生成,不执行 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
Run Code Online (Sandbox Code Playgroud)
要查看估计的执行计划,您需要使用DBMS_XPLAN.DISPLAY,如下例所示:
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'))
Run Code Online (Sandbox Code Playgroud)
与使用默认格式选项相比,ALL +OUTLINE 格式选项允许您获得有关估计执行计划的更多详细信息。
如果您安装了 SQL Developer,您可以轻松获得任何 SQL 查询的估计执行计划,而无需预先添加 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
Run Code Online (Sandbox Code Playgroud)
要可视化实际执行计划,您可以使用DBMS_XPLAN.DISPLAY_CURSOR:
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST ALL +OUTLINE'))
Run Code Online (Sandbox Code Playgroud)
如果要获取给定会话中生成的所有查询的执行计划,可以将会话STATISTICS_LEVEL配置设置为 ALL:
ALTER SESSION SET STATISTICS_LEVEL='ALL'
Run Code Online (Sandbox Code Playgroud)
这与GATHER_PLAN_STATISTICS在每个执行查询上设置查询提示具有相同的效果。因此,就像GATHER_PLAN_STATISTICS查询提示一样,您可以使用DBMS_XPLAN.DISPLAY_CURSOR来查看实际的执行计划。
STATISTICS_LEVEL收集完您感兴趣的执行计划后,您应该将设置重置为默认模式。这非常重要,尤其是当您使用连接池并且数据库连接被重用时。Run Code Online (Sandbox Code Playgroud)ALTER SESSION SET STATISTICS_LEVEL='TYPICAL'