Co je to Virtual Index v Oracle?
- Virtuální index je „falešný“ index, jehož definice existuje v datovém slovníku, ale nemá přidružený segment indexu.
- Poradce pro ladění sql vám mnohokrát doporučuje vytvořit nový index a chcete nový index otestovat. V tomto případě může přidání indexů do velkých tabulek trvat dlouho a zabere to velký diskový prostor, i když je tabulka velká. Dodatečné indexy jsou také k dispozici pro použití jinými relacemi, což může ovlivnit výkon jiných částí. vaší aplikace, kterou aktuálně netestujete. To může být zvláště problematické, když se pokoušíte identifikovat problémy v produkčním systému. Virtuální indexy tento problém řeší
- Účelem virtuálních indexů je simulovat existenci indexu – bez skutečného vytváření úplného indexu.
- To vývojářům umožňuje spustit plán vysvětlení, jako by byl index přítomen, aniž by čekali na dokončení vytváření indexu a bez použití dalšího místa na disku.
- Umíme analyzovat virtuální indexy.
- Nemůžete znovu vytvořit virtuální index; vyvolá to ORA-8114:„Uživatel se pokusil změnit falešný index“
- Index můžete zrušit jako běžný index.
SQL> drop index <index_name>;
Důležité body k zapamatování
(1) Abychom tuto funkci mohli používat, musíme na úrovni relace nastavit „_USE_NOSEGMENT_INDEXES“ na hodnotu true
(2) Virtuální indexy se vytvářejí přidáním části bez segmentů na konci skriptu pro vytváření indexu
Příklad pro demonstraci použití virtuálního indexu v Oracle
(1) Vytvořte vzorovou tabulku, řekněte virtual_test_t
SQL> create table virtual_test_t as select * from dba_objects where rownum < 100000;
(2) Vyberte libovolnou hodnotu z tabulky
SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
(3) Zkontrolujte plán vysvětlení Oracle pro dotaz SELECT.
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) Vytvořte virtuální index na vytvořené tabulce.
SQL> create index test_index_v on virtual_test_t(object_name) nosegment;
Pamatujte, že chcete-li vytvořit virtuální index, musíte v příkazu CREATE INDEX zadat klauzuli NOSEGMENT.
Spuštěním výše uvedeného příkazu se také nevytvoří segment indexu.
(5) Totéž můžete zkontrolovat pomocí následujícího:
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';
Objekt tedy existuje v databázi, ale nemáme pro něj segment.
(6) Nyní spusťte totéž a zkontrolujte, zda je index používán.
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 |
Můžeme jasně pozorovat, že index není používán.
(7) Aby bylo možné využít vytvořený virtuální index, musíme nastavit parametr _USE_NOSEGMENT_INDEXES na hodnotu true.
SQL> alter session set "_USE_NOSEGMENT_INDEXES" = true;
Session altered.
(8) Nyní spusťte stejný příkaz SELECT.
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 |
Jakmile nastavíte tento skrytý parametr, optimalizátor oracle začne používat virtuální index, který jste vytvořili v této tabulce.
Pokud tento dotaz spustíte z jakékoli jiné relace, nebude používat tento virtuální index (jak jsme použili „alter session” prohlášení).