Co to jest indeks wirtualny w Oracle?
- Wirtualny indeks to „fałszywy” indeks, którego definicja istnieje w słowniku danych, ale nie ma powiązanego segmentu indeksu.
- Wiele razy doradca dostrajania sql zaleca utworzenie nowego indeksu i chcesz go przetestować. W takim przypadku dodanie indeksów do dużych tabel może zająć dużo czasu i zużyje dużo miejsca na dysku, także jeśli tabela jest duża. Ponadto dodatkowe indeksy są dostępne do użytku przez inne sesje, co może mieć wpływ na wydajność innych części aplikacji, której obecnie nie testujesz. Może to być szczególnie problematyczne, gdy próbujesz zidentyfikować problemy w systemie produkcyjnym. Wirtualne indeksy rozwiązują ten problem
- Celem wirtualnych indeksów jest symulacja istnienia indeksu – bez faktycznego budowania pełnego indeksu
- Pozwala to programistom na uruchomienie planu wyjaśniania tak, jakby indeks był obecny, bez czekania na zakończenie tworzenia indeksu i bez używania dodatkowego miejsca na dysku.
- Możemy analizować wirtualne indeksy.
- Nie można odbudować indeksu wirtualnego; rzuca ORA-8114:„Użytkownik próbował zmienić fałszywy indeks”
- Możesz upuścić indeks tak samo jak normalny indeks.
SQL> drop index <index_name>;
Ważne punkty do zapamiętania
(1) Aby korzystać z tej funkcji, musimy ustawić „_USE_NOSEGMENT_INDEXES” na wartość true na poziomie sesji
(2) Wirtualne indeksy są tworzone z dodatkiem części bezsegmentowej na końcu skryptu tworzenia indeksu
Przykład demonstrujący użycie wirtualnego indeksu w Oracle
(1) Utwórz przykładową tabelę, powiedz virtual_test_t
SQL> create table virtual_test_t as select * from dba_objects where rownum < 100000;
(2) Wybierz dowolną wartość z tabeli
SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
(3) Sprawdź plan wyjaśnienia Oracle dla zapytania 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) Utwórz wirtualny indeks na utworzonej tabeli.
SQL> create index test_index_v on virtual_test_t(object_name) nosegment;
Pamiętaj, że aby utworzyć wirtualny indeks, musisz określić klauzulę NOSEGMENT w instrukcji CREATE INDEX.
Zauważ również, że wykonując powyższą instrukcję, segment indeksu nie jest tworzony.
(5) To samo możesz sprawdzić w następujący sposób:
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';
Tak więc obiekt istnieje w bazie danych, ale nie mamy segmentu dla tego samego.
(6) Teraz uruchom to samo, aby sprawdzić, czy indeks jest używany.
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 |
Możemy wyraźnie zaobserwować, że indeks nie jest używany.
(7) Aby skorzystać z utworzonego wirtualnego indeksu, musimy ustawić parametr _USE_NOSEGMENT_INDEXES na true.
SQL> alter session set "_USE_NOSEGMENT_INDEXES" = true;
Session altered.
(8) Teraz uruchom tę samą instrukcję 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 |
Po ustawieniu tego ukrytego parametru optymalizator Oracle zacznie używać wirtualnego indeksu, który utworzyłeś w tej tabeli.
Jeśli uruchomisz to zapytanie z dowolnej innej sesji, nie użyje tego wirtualnego indeksu (ponieważ użyliśmy „alter sesji” oświadczenie).