sql >> Databáze >  >> RDS >> Oracle

Jak používat virtuální index v databázi Oracle

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í).


  1. Oracle:Kombinujte více výsledků v dílčím dotazu do jediné hodnoty oddělené čárkami

  2. Aktualizace Postgresql s připojením

  3. Jak vytvořit počítané pole v dotazu Microsoft Access

  4. Jak DIV funguje v MariaDB