Vad är Virtual Index i Oracle?
- Ett virtuellt index är ett "falskt" index vars definition finns i dataordboken, men som inte har något associerat indexsegment.
- Many time sql tuning advisor rekommenderar att du skapar ett nytt index och du vill testa det nya indexet. I det här fallet kan det ta lång tid att lägga till index till stora tabeller och det kommer att förbruka stort diskutrymme även om tabellen är stor. De ytterligare indexen är också tillgängliga för användning av andra sessioner, vilket kan påverka prestandan för andra delar av din applikation som du för närvarande inte testar. Detta kan vara speciellt problematiskt när du försöker identifiera problem på ett produktionssystem. Virtuella index löser detta problem
- Syftet med virtuella index är att simulera förekomsten av ett index – utan att egentligen bygga ett fullständigt index
- Detta tillåter utvecklare att köra en förklarande plan som om indexet finns utan att vänta på att indexskapandet ska slutföras och utan att använda ytterligare diskutrymme.
- Vi kan analysera virtuella index.
- Du kan inte bygga om ett virtuellt index; den kastar en ORA-8114:"Användaren försökte ändra ett falskt index"
- Du kan ta bort indexet precis som ett vanligt index.
SQL> drop index <index_name>;
Viktigt att komma ihåg
(1) Vi måste ställa in "_USE_NOSEGMENT_INDEXES" till sant på sessionsnivå för att använda den här funktionen
(2) Virtuella index skapas med tillägg av en del utan segment i slutet av skriptet för att skapa index
Exempel för att demonstrera användningen av Virtual Index i Oracle
(1) Skapa en exempeltabell, säg virtual_test_t
SQL> create table virtual_test_t as select * from dba_objects where rownum < 100000;
(2) Välj valfritt värde från tabellen
SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
(3) Kontrollera Oracle Explain-planen för SELECT-frågan.
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) Skapa ett virtuellt index på tabellen som skapas.
SQL> create index test_index_v on virtual_test_t(object_name) nosegment;
Kom ihåg att för att skapa ett virtuellt index måste du ange NOSEGMENT-satsen i CREATE INDEX-satsen.
Observera att genom att köra ovanstående sats, skapas inte ett indexsegment.
(5) Du kan kontrollera detsamma med följande:
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 finns i databasen, men vi har inget segment för detsamma.
(6) Kör nu samma sak för att kontrollera om indexet används.
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 tydligt observera att indexet inte används.
(7) För att kunna använda det skapade virtuella indexet måste vi ställa in parametern _USE_NOSEGMENT_INDEXES till true.
SQL> alter session set "_USE_NOSEGMENT_INDEXES" = true;
Session altered.
(8) Kör nu samma SELECT-sats.
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 väl har ställt in den här dolda parametern kommer oracle-optimeraren att börja använda det virtuella indexet som du skapade i den här tabellen.
Om du kör den här frågan från någon annan session kommer den inte att använda detta virtuella index (som vi har använt "alter" session” uttalande).