21

我现在正在学习数据库索引,并试图了解使用它们的效率。

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

我正在使用sql+

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

4

5 回答 5

28

试试用这段代码先解释一下再看方案:

解释计划:

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

看计划:

select * from table(dbms_xplan.display);

编辑:删除括号

于 2012-08-03T17:36:17.507 回答
5

预估的 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 格式化选项允许您获得有关估计执行计划的更多详细信息,而不是使用默认格式化选项。

甲骨文 SQL 开发人员

如果您已经安装了 SQL Developer,您可以轻松获得任何 SQL 查询的估计执行计划,而无需预先添加 EXPLAIN PLAN FOR 命令:

在此处输入图像描述

##实际的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'
于 2019-09-04T07:24:45.867 回答
3

看看解释计划。EXPLAIN 适用于许多数据库类型。

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

于 2012-08-03T16:17:22.017 回答
2

尝试这个:

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

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

于 2012-08-03T16:15:34.007 回答
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.

或者

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

于 2018-08-04T19:03:52.897 回答