Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So verwenden Sie den virtuellen Index in der Oracle-Datenbank

Was ist ein virtueller Index in Oracle?

  • Ein virtueller Index ist ein „gefälschter“ Index, dessen Definition im Datenwörterbuch vorhanden ist, aber kein zugeordnetes Indexsegment hat.
  • Manchmal empfiehlt der SQL Tuning Advisor Ihnen, einen neuen Index zu erstellen, und Sie möchten den neuen Index testen. In diesem Fall kann das Hinzufügen von Indizes zu großen Tabellen viel Zeit in Anspruch nehmen, und es wird viel Speicherplatz verbraucht, auch wenn die Tabelle groß ist. Außerdem stehen die zusätzlichen Indizes für die Verwendung durch andere Sitzungen zur Verfügung, was die Leistung anderer Teile beeinträchtigen kann Ihrer Anwendung, die Sie derzeit nicht testen. Dies kann besonders problematisch sein, wenn Sie versuchen, Probleme auf einem Produktionssystem zu identifizieren. Virtuelle Indizes lösen dieses Problem
  • Der Zweck virtueller Indizes besteht darin, die Existenz eines Index zu simulieren – ohne tatsächlich einen vollständigen Index zu erstellen
  • Auf diese Weise können Entwickler einen EXPLAIN-Plan ausführen, als ob der Index vorhanden wäre, ohne auf den Abschluss der Indexerstellung zu warten und ohne zusätzlichen Speicherplatz zu belegen.
  • Wir können virtuelle Indizes analysieren.
  • Sie können einen virtuellen Index nicht neu aufbauen; es wirft einen ORA-8114:„Benutzer hat versucht, einen gefälschten Index zu ändern“
  • Sie können den Index wie einen normalen Index löschen.
SQL> drop index <index_name>;

Wichtige Punkte, die Sie sich merken sollten

(1) Wir müssen „_USE_NOSEGMENT_INDEXES“ auf Sitzungsebene auf „true“ setzen, um diese Funktion zu verwenden
(2) Virtuelle Indizes werden mit dem Hinzufügen eines Teils ohne Segment am Ende des Indexerstellungsskripts erstellt

Beispiel zur Demonstration der Verwendung von Virtual Index in Oracle

(1) Erstellen Sie eine Beispieltabelle, sagen wir virtual_test_t

SQL> create table virtual_test_t as select * from dba_objects where rownum < 100000;

(2) Wählen Sie einen beliebigen Wert aus der Tabelle aus

SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';

(3) Prüfen Sie den Explain-Plan von Oracle für die SELECT-Abfrage.

SQL> set autotrace traceonly explain
SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 8 | 1416 | 156 (2)| 00:00:02 |
|* 1 | TABLE ACCESS FULL| VIRTUAL_TEST_T | 8 | 1416 | 156 (2)| 00:00:02 |

(4) Erstellen Sie einen virtuellen Index für die erstellte Tabelle.

SQL> create index test_index_v on virtual_test_t(object_name) nosegment;

Denken Sie daran, dass Sie zum Erstellen eines virtuellen Index die NOSEGMENT-Klausel in der CREATE INDEX-Anweisung angeben müssen.
Beachten Sie außerdem, dass durch Ausführen der obigen Anweisung kein Indexsegment erstellt wird.

(5) Sie können dasselbe mit dem Folgenden überprüfen:

SQL> set autotrace off
SQL> select index_name from dba_indexes where table_name = 'VIRTUAL_TEST_T' and index_name = 'TEST_INDEX_V';

no rows selected

SQL> col OBJECT_NAME format a20;
SQL> select object_name, object_type from dba_objects where object_name = 'TEST_INDEX_V';

Das Objekt existiert also in der Datenbank, aber wir haben kein Segment dafür.

(6) Führen Sie nun dasselbe aus, um zu prüfen, ob der Index verwendet wird.

SQL> set autotrace traceonly explain
SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 8 | 1416 | 156 (2)| 00:00:02 |
|* 1 | TABLE ACCESS FULL| VIRTUAL_TEST_T | 8 | 1416 | 156 (2)| 00:00:02 |

Wir können deutlich beobachten, dass der Index nicht verwendet wird.

(7) Um den erstellten virtuellen Index zu verwenden, müssen wir den Parameter _USE_NOSEGMENT_INDEXES auf true setzen.

SQL> alter session set "_USE_NOSEGMENT_INDEXES" = true;
Session altered.

(8) Führen Sie nun dieselbe SELECT-Anweisung aus.

SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 8 | 1416 | 5 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| VIRTUAL_TEST_T | 8 | 1416 | 5 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | TEST_INDEX_V | 216 | | 1 (0)| 00:00:01 |

Sobald Sie diesen versteckten Parameter festgelegt haben, beginnt der Oracle-Optimierer mit der Verwendung des virtuellen Index, den Sie für diese Tabelle erstellt haben.
Wenn Sie diese Abfrage von einer anderen Sitzung aus ausführen, wird dieser virtuelle Index nicht verwendet (da wir „alter Session“-Erklärung).