我怎么能看到执行计划

时间:2012-08-03 16:06:14

标签: oracle sqlplus sql-execution-plan

我正在学习数据库索引,我正在努力了解使用它们的效率。

  • 我想查看特定查询是否使用索引。
  • 我想实际看到使用索引执行查询与不使用索引之间的区别(所以我想查看查询的执行计划)。

我正在使用 sql +

如何查看执行计划,我在哪里可以找到告诉我我的索引是否被使用的信息?

5 个答案:

答案 0 :(得分:24)

尝试使用此代码首先解释然后查看计划:

解释计划:

explain plan 
for 
select * from table_name where ...;

参见计划:

select * from table(dbms_xplan.display);

编辑:删除括号

答案 1 :(得分:3)

看看Explain Plan。 EXPLAIN适用于许多数据库类型。

对于sqlPlus,请参阅sqlplus的AUTO TRACE工具。

答案 2 :(得分:2)

试试这个:

http://www.dba-oracle.com/t_explain_plan.htm

执行计划将在使用时提及索引。只需阅读执行计划。

答案 3 :(得分:1)

SQL> explain plan for 2 
     select * from hr.employees;

解释。

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

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1445457117

-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 107 | 7704 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMPLOYEES | 107 | 7704 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------

8 rows selected.

OR

SQL> set autotrace traceonly explain
SQL> select * from hr.employees;

Execution Plan
----------------------------------------------------------
Plan hash value: 1445457117

-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 107 | 7704 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMPLOYEES | 107 | 7704 | 3 (0)| 00:00:01 |

https://wordpress.com/post/cevikfaruk.wordpress.com/277

答案 4 :(得分:0)

  

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

估计的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 Developer

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

enter image description here

实际的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_LEVEL会话配置设置为ALL:

ALTER SESSION SET STATISTICS_LEVEL='ALL'

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

  

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

ALTER SESSION SET STATISTICS_LEVEL='TYPICAL'