如何检查Oracle中是否使用了索引

时间:2015-09-21 10:03:42

标签: sql oracle

SELECT * 
FROM   (SELECT TEMP.*, 
               ROWNUM RNUM 
        FROM   (SELECT entry_guid 
                FROM   alertdevtest.ENTRY 
                WHERE  Upper(alert_name) = 'alertname' 
                       AND user_guid = 'AlertProductClientTest' 
                       AND product_code = '-101' 
                       AND status_code != 13) TEMP 
        WHERE  ROWNUM <= 2500) 
WHERE  rnum >= 0; 

SELECT * 
FROM   (SELECT TEMP.*, 
               ROWNUM RNUM 
        FROM   (SELECT entry_guid 
                FROM   alertdevtest.ENTRY 
                WHERE  Upper(alert_name) = 'alertname' 
                       AND user_guid = 'AlertProductClientTest' 
                       AND product_code = '-101' 
                       AND status_code != 13 
                       AND product_view IN ( 'PView' )) TEMP 
        WHERE  ROWNUM <= 2500) 
WHERE  rnum >= 0; 

在第二个查询中运行查询并查看性能下降与第一个查询相比。唯一的区别是第二个查询中的附加过滤器AND PRODUCT_VIEW IN('PView')。但它在该专栏上有索引。请告诉我性能下降的原因是什么,如何检查索引是否被使用?我正在使用Oracle SQL开发人员并尝试检查解释计划,但无法获得更多详细信息。

3 个答案:

答案 0 :(得分:4)

在Oracle SQL Developer中,当您在工作表中有SQL时,有一个按钮&#34; Explain Plan&#34;,您也可以点击F10。执行Explain计划后,它将显示在SQL Developer的底视图中。有一列&#34; OBJECT_NAME&#34;,它会告诉您正在使用的索引。例如,在我刚刚运行的查询中,在左栏(OPERATION)中显示&#34; SELECT STATEMENT&#34;首先是SORT(AGGREGATE),然后是INDEX(RANGE SCAN),然后在OBJECT_NAME列中显示TICKER_IDX1,这是我桌子上索引的名称。

因此,您可以通过OBJECT_NAME列查看正在使用的索引。

Oracle Cost Based Optimizer可能会选择次优执行计划。很多时候更新统计数据都可以解决问题。其他选择是添加其他索引,换句话说是多列索引。您可以提示SQL语句,但这很少需要。此外,还可以重写查询。

答案 1 :(得分:3)

EXPLAIN PLAN语句是检查执行计划的最佳方式。   图形执行计划被认为是有害的。

EXPLAIN PLAN与执行计划的常见图形表示相比有许多好处:

  1. 简单,标准格式 DBMS_XPLAN.DISPLAY适用于任何环境,并生成每个Oracle专业人员都熟悉的输出。有权访问Oracle的任何人都可以重现该问题,每个人都可以使用相同的标准名称来讨论该问题。 SQL Developer可能是免费的,但大多数开发人员和DBA都不使用它。
  2. 易于处理输出输出易于保存和共享 - 将输出存储在表格中,将文本复制到记事本中等。使用a进行比较也更容易像WinMerge这样的程序。大型查询可能会在执行计划中产生数百行,使用diff实用程序可以使调优更容易。对于编程任务,文本优于图片。
  3. 包含重要部分出于某些奇怪的原因,IDE从不在执行计划中包含Note部分。该部分通常包含重要信息。在您的示例中,DBA可能会为其中一个查询修复SQL计划基准而不是另一个查询。如果没有Notes部分,我们只需要猜测是否有奇怪的事情发生。
  4. 更准确有些工具使用单独的会话来生成图形执行计划并产生错误的结果。例如,没有alter session enable parallel dml;,计划可能会有很大差异。这对SQL Developer来说似乎不是问题,但我已经在其他程序中看到了它。
  5. 更强大 DBMS_XPLAN可以编写脚本并具有许多强大功能,例如format => '+outline'dbms_xplan.display_awr等。
  6. 以下是EXPLAIN PLAN的简单示例。这个计划很好,但确实有一个巨大的红旗,大多数图形执行计划都不会显示。最后一行,  dynamic statistics used: dynamic sampling (level=2)表示其中一个表缺少优化程序统计信息。

    drop table test1;
    create table test1(a number);
    explain plan for insert into test1 select * from test1;
    select * from table(dbms_xplan.display);
    
    Plan hash value: 4122059633
    
    ----------------------------------------------------------------------------------
    | Id  | Operation                | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------
    |   0 | INSERT STATEMENT         |       |     1 |    13 |     2   (0)| 00:00:01 |
    |   1 |  LOAD TABLE CONVENTIONAL | TEST1 |       |       |            |          |
    |   2 |   TABLE ACCESS FULL      | TEST1 |     1 |    13 |     2   (0)| 00:00:01 |
    ----------------------------------------------------------------------------------
    
    Note
    -----
       - dynamic statistics used: dynamic sampling (level=2)
    

    为了快速检查,您可以更轻松地按F10,F5,ctrl + E或特定IDE中的快捷方式。但是,对于将与他人分享的严肃分析,请始终使用EXPLAIN PLAN

答案 2 :(得分:0)

了解性能不佳的原因最好是获取SQL * Trace。 有几种方法可以启用跟踪http://docs.oracle.com/cd/B19306_01/server.102/b14211/sqltrace.htm#g33356 例如

EXECUTE DBMS_SESSION.SESSION_TRACE_ENABLE(waits => TRUE, binds => TRUE);

您需要启用跟踪,运行这些查询,获取数据到最后(因为通常在获取期间执行的大部分工作),关闭会话(需要关闭游标以使执行计划随时间统计出现在跟踪文件中) 。
然后你应该去数据库服务器上的转储文件夹,获取跟踪文件,用户tkprof实用程序将其转换为更易读的方式,在里面找到这些查询,享受:)。
SQL Trace的好处在于它提供了在SQL执行期间使用的真实计划,并且它为计划的每个步骤提供了非常精确的时间,读取,获取,一致读取,CPU统计(不幸的是,我不知道任何其他可以做到这一点的工具) 缺点是你需要特权来开始跟踪,你需要访问转储文件夹(或者你需要让DBA执行带有跟踪和服务器管理员的查询来获取文件)。
更粗略的选择是启用对此SQL的监视(例如通过/ * + monitor * / hint)并使用DBMS_SQLTUNE.REPORT_SQL_MONITOR http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_sqltun.htm#CHDBHIBG - 它可以为执行计划的每个步骤生成包含统计信息的漂亮HTML(如在SQL Trace中)
优点是易于使用(您不需要访问服务器文件夹即可使用它) 缺点是在这种情况下,统计数据通常为1秒,因此仅对长时间运行的查询(10秒或更长时间)有用。
如果只需检查SQL执行期间是否使用了索引,则可以查询v $ sql_plan视图和v $ sql,v $ sql_monitor视图以查找相应的计划。