2012-10-24 15 views
5

Czy istnieje sposób na sprawdzenie, czy konkretny indeks Oracle był kiedykolwiek używany przez Oracle podczas wykonywania zapytania?Używanie indeksu monitorów

Mamy indeks bazujący na funkcjach, który, jak podejrzewam, nie jest wykorzystywany przez Oracle i dlatego niektóre zapytania działają wolno. Jak mogę się dowiedzieć, czy jakiekolwiek zapytanie uruchamiane w bazie danych używa tego zapytania?

+1

Pytasz, czy jeden konkretny kwerendy używa indeksu, lub jeśli są jakieś pytania, które kiedykolwiek korzystać z indeksu? –

+0

Tak ... Pytałem, czy w ogóle nie było żadnych zapytań, które używały konkretnego indeksu. Odpowiedź poniżej Robert wydaje się być odpowiednia :-) – Guddu

Odpowiedz

5

Jeśli używasz jakiegoś IDE (np. Oracle Developer SQL, Programista PL/SQL od Allround Automations, Toad, itp.), Każdy z nich ma jakiś sposób na zrzucenie planu na wyciągnięcie ręki - menu i pomoc on-line.

Jeśli możesz uzyskać dostęp do SQL * Plus (spróbuj wpisać "sql" w przyjaznym wierszu poleceń), możesz włączyć automatyczne włączanie, wykonać wyciąg, a plan powinien zostać wydrukowany. Tak jak w

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 

Zakładamy, że twój przyjazny sąsiedztwo DBA wykonał niezbędne zaklęcia, aby włączyć tę funkcję. Jeśli nie zostało to zrobione, lub chcesz po prostu jeszcze jeden sposób (tm), aby to zrobić, spróbuj coś takiego jak poniżej, zastępując zapytania zależy Ci o:

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. 

Podziel się i cieszyć.

+0

Dzięki Bob ... Moje pytanie było trochę inne, ale ta informacja była nadal przydatna. – Guddu

+0

@BobJarvis To bardzo pomocne. +10 jeśli mógłbym –

Powiązane problemy