sql >> Database >  >> RDS >> Oracle

Virtuele index gebruiken in Oracle Database

Wat is een virtuele index in Oracle?

  • Een virtuele index is een 'nep'-index waarvan de definitie wel voorkomt in de datadictionary, maar waaraan geen indexsegment is gekoppeld.
  • Vaak raadt sql tuning advisor u aan een nieuwe index te maken en u wilt de nieuwe index testen. In dit geval kan het veel tijd kosten om indexen aan grote tabellen toe te voegen en het zal ook veel schijfruimte in beslag nemen als de tabel groot is. Ook zijn de extra indexen beschikbaar voor gebruik door andere sessies, wat de prestaties van andere delen kan beïnvloeden van uw toepassing die u momenteel niet aan het testen bent. Dit kan met name problematisch zijn wanneer u problemen op een productiesysteem probeert te identificeren. Virtuele indexen lossen dit probleem op
  • Het doel van virtuele indexen is om het bestaan ​​van een index te simuleren – zonder daadwerkelijk een volledige index te bouwen
  • Hierdoor kunnen ontwikkelaars een uitlegplan uitvoeren alsof de index aanwezig is zonder te wachten tot het maken van de index is voltooid en zonder extra schijfruimte te gebruiken.
  • We kunnen virtuele indexen analyseren.
  • Je kunt een virtuele index niet opnieuw opbouwen; het gooit een ORA-8114:"Gebruiker probeerde een nep-index te wijzigen"
  • Je kunt de index net als een normale index neerzetten.
SQL> drop index <index_name>;

Belangrijke punten om te onthouden

(1) We moeten "_USE_NOSEGMENT_INDEXES" instellen op true op sessieniveau om deze functie te gebruiken
(2) Virtuele indexen worden gemaakt met de toevoeging van een gedeelte zonder segment aan het einde van het script voor het maken van een index

Voorbeeld om het gebruik van Virtual Index in Oracle te demonstreren

(1) Maak een voorbeeldtabel, bijvoorbeeld virtual_test_t

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

(2) Selecteer een waarde uit de tabel

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

(3) Controleer het orakel Explain-plan voor de SELECT-query.

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) Maak een virtuele index op de gemaakte tabel.

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

Onthoud dat u, om een ​​virtuele index te maken, de NOSEGMENT-clausule moet specificeren in de CREATE INDEX-instructie.
Ook bij het uitvoeren van de bovenstaande instructie wordt er geen indexsegment gemaakt.

(5) U kunt hetzelfde controleren met het volgende:

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

Het object bestaat dus in de database, maar we hebben er geen segment voor.

(6) Voer nu hetzelfde uit om te controleren of de index wordt gebruikt.

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 |

We kunnen duidelijk zien dat de index niet wordt gebruikt.

(7) Om gebruik te maken van de gecreëerde virtuele index, moeten we de parameter _USE_NOSEGMENT_INDEXES instellen op true.

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

(8) Voer nu dezelfde SELECT-instructie uit.

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 |

Zodra u deze verborgen parameter instelt, zal de oracle-optimizer de virtuele index gaan gebruiken die u voor deze tabel hebt gemaakt.
Als u deze query uitvoert vanuit een andere sessie, zal deze deze virtuele index niet gebruiken (zoals we hebben gebruikt "alter sessie” statement).


  1. Het verschil in maanden tussen datums in MySQL

  2. Vergelijk data in MySQL

  3. Variabele declareren in PostgreSQL

  4. Hoe kan ik geselecteerde rijen bijwerken met waarden uit een CSV-bestand in Postgres?