sql >> Database teknologi >  >> RDS >> Oracle

Sådan bruger du Virtual Index i Oracle-databasen

Hvad er  Virtual Index i Oracle?

  • Et virtuelt indeks er et "falsk" indeks, hvis definition findes i dataordbogen, men som ikke har noget tilknyttet indekssegment.
  • Mange gange anbefaler sql tuning advisor, at du opretter et nyt indeks, og du vil teste det nye indeks. I dette tilfælde kan det tage lang tid at tilføje indekser til store tabeller, og det vil forbruge stor diskplads, også hvis bordet er stort. De ekstra indekser er også tilgængelige til brug for andre sessioner, hvilket kan påvirke ydeevnen af ​​andre dele af din applikation, som du ikke tester i øjeblikket. Dette kan være særligt problematisk, når du forsøger at identificere problemer på et produktionssystem. Virtuelle indekser løser dette problem
  • Formålet med virtuelle indekser er at simulere eksistensen af ​​et indeks – uden egentlig at bygge et fuldt indeks
  • Dette giver udviklere mulighed for at køre en forklaringsplan, som om indekset er til stede uden at vente på, at indekset er oprettet, og uden at bruge yderligere diskplads.
  • Vi kan analysere virtuelle indekser.
  • Du kan ikke genopbygge et virtuelt indeks; den kaster en ORA-8114:"Bruger forsøgte at ændre et falsk indeks"
  • Du kan slette indekset ligesom et normalt indeks.
SQL> drop index <index_name>;

Vigtige punkter at huske

(1) Vi er nødt til at indstille "_USE_NOSEGMENT_INDEXES" til sand på sessionsniveau for at bruge denne funktion
(2) Virtuelle indekser oprettes med tilføjelsen af ​​en del uden segment i slutningen af ​​indeksoprettelsesscriptet

Eksempel til at demonstrere brugen af ​​Virtual Index i Oracle

(1) Opret en eksempeltabel, sig virtual_test_t

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

(2) Vælg en hvilken som helst værdi fra tabellen

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

(3) Tjek oracle Explain-planen for SELECT-forespørgslen.

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) Opret et virtuelt indeks på den oprettede tabel.

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

Husk, for at oprette et virtuelt indeks skal du angive NOSEGMENT-udtrykket i CREATE INDEX-sætningen.
Bemærk også, at der ikke oprettes et indekssegment ved at udføre ovenstående sætning.

(5) Du kan kontrollere det samme med følgende:

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';

Så objektet eksisterer i databasen, men vi har ikke segment til det samme.

(6) Kør nu det samme for at kontrollere, om indekset bliver brugt.

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 |

Vi kan tydeligt konstatere, at indekset ikke bliver brugt.

(7) For at gøre brug af det oprettede virtuelle indeks skal vi indstille parameteren _USE_NOSEGMENT_INDEXES til sand.

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

(8) Kør nu den samme SELECT-sætning.

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 |

Når du har indstillet denne skjulte parameter, vil Oracle Optimizer begynde at bruge det virtuelle indeks, du oprettede på denne tabel.
Hvis du kører denne forespørgsel fra en anden session, vil den ikke bruge dette virtuelle indeks (som vi har brugt "alter" session” erklæring).


  1. MySQL 'Bestil efter' - sorterer alfanumerisk korrekt

  2. Microsoft Access – det grundlæggende

  3. Hvad er den ideelle datatype at bruge, når du gemmer breddegrad/længdegrad i en MySQL-database?

  4. Hvorfor starter tabelnavne i SQL Server med dbo?