2012-10-24 13 views
5

Gibt es eine Möglichkeit zu finden, ob Oracle bei der Ausführung einer Abfrage jemals einen bestimmten Oracle-Index verwendet hat?Monitorindexverwendung

Wir haben einen funktionsbasierten Index, von dem ich vermute, dass er nicht von Oracle verwendet wird und daher einige Abfragen langsam ausgeführt werden. Wie kann ich herausfinden, ob eine Abfrage, die für die Datenbank ausgeführt wird, diese Abfrage verwendet?

+1

Sind Sie fragen, ob eine bestimmte Abfrage den Index verwendet, oder wenn es irgendwelche Anfragen, die jemals den Index verwenden? –

+0

Ja ... Ich habe gefragt, ob überhaupt irgendwelche Abfragen einen bestimmten Index verwenden. Die Antwort von Robert scheint genau richtig zu sein :-) – Guddu

Antwort

5

Wenn Sie irgendeine Art von IDE verwenden (zB Oracle SQL Developer, PL/SQL Entwickler von Allround Automations, Toad, etc), hat jeder von ihnen eine Möglichkeit den Plan für eine Aussage zu löschen - stöbern Sie in der Menüs und die Online-Hilfe.

Wenn Sie in SQL * Plus kommen können (versuchen Sie, "sql" in Ihrer befreundeten Befehlszeile einzugeben), können Sie autotrace einschalten, Ihre Anweisung ausführen und der Plan sollte gedruckt werden. Wie in

SQL> set autotrace on 
SQL> select * from dept where deptno = 40; 
    DEPTNO DNAME   LOC 
---------- -------------- ------------- 
     40 OPERATIONS  BOSTON 

Execution Plan 
---------------------------------------------------------- 
    0  SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=18) 
    1 0 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' (Cost=1 Card=1 Bytes=18) 
    2 1  INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE) 

Statistics 
---------------------------------------------------------- 
      0 recursive calls 
      0 db block gets 
      2 consistent gets 
      0 physical reads 
      0 redo size 
     499 bytes sent via SQL*Net to client 
     503 bytes received via SQL*Net from client 
      2 SQL*Net roundtrips to/from client 
      0 sorts (memory) 
      0 sorts (disk) 
      1 rows processed 

Dies setzt voraus, dass Ihre freundliche Nachbarschaft DBA die notwendigen Beschwörungen diese Funktion aktivieren durchgeführt hat. Wenn dies nicht geschehen ist, oder Sie wollen nur eine weitere Möglichkeit (tm), dies zu tun, versuchen Sie so etwas wie die folgenden, wobei man die Abfrage, die Sie interessieren:

SQL> EXPLAIN PLAN FOR select * from dept where deptno = 40; 
Explained. 

SQL> set linesize 132 

SQL> SELECT * FROM TABLE(dbms_xplan.display); 

PLAN_TABLE_OUTPUT 
--------------------------------------------------------------------------------------- 
Plan hash value: 2852011669 

--------------------------------------------------------------------------------------- 
| Id | Operation     | Name | Rows | Bytes | Cost (%CPU)| Time  | 
--------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT   |   |  1 | 20 |  1 (0)| 00:00:01 | 
| 1 | TABLE ACCESS BY INDEX ROWID| DEPT |  1 | 20 |  1 (0)| 00:00:01 | 
|* 2 | INDEX UNIQUE SCAN   | PK_DEPT |  1 |  |  0 (0)| 00:00:01 | 
--------------------------------------------------------------------------------------- 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    2 - access("DEPTNO"=40) 

14 rows selected. 

teilen und genießen.

+0

Danke Bob ... Meine Frage war zwar etwas anders, aber diese Information war immer noch nützlich. – Guddu

+0

@BobJarvis Das ist sehr hilfreich. +10 wenn ich könnte –