In het vorige artikel hebben we geleerd over de gepartitioneerde Oracle-tabel. Als vervolg op die serie zal ik hier de Oracle partitie-index presenteren
Hier zijn enkele feiten over het begrijpen van gepartitioneerde indexen
Lokale partitie-indexen
- Er wordt een lokale index op een gepartitioneerde tabel gemaakt waarbij de index op precies dezelfde manier wordt gepartitioneerd als de onderliggende gepartitioneerde tabel. Dat wil zeggen, de lokale index erft de partitioneringsmethode van de tabel. Dit staat bekend als equi-partitionering.
- Voor lokale indexen verwijzen de indexsleutels in de index alleen naar de rijen die zijn opgeslagen in de enkele onderliggende tabelpartitie. Een lokale index wordt gemaakt door het LOCAL-attribuut op te geven en kan worden gemaakt als UNIQUE of NON-UNIQUE.
- De tabel en de lokale index zijn ofwel op precies dezelfde manier gepartitioneerd, of hebben dezelfde partitiesleutel omdat de lokale indexen automatisch worden onderhouden, wat een hogere beschikbaarheid kan bieden.
- Omdat de Oracle-database ervoor zorgt dat de indexpartities worden gesynchroniseerd met hun corresponderende tabelpartities, volgt daaruit dat de database automatisch de indexpartitie onderhoudt wanneer er onderhoud wordt uitgevoerd op de onderliggende tabellen
- bijvoorbeeld, wanneer partities worden toegevoegd, verwijderd of samengevoegd.
- Een lokale index wordt voorafgegaan door als de partitiesleutel van de tabel en de indexsleutel hetzelfde zijn; anders is het een lokale index zonder prefix
SQL> MAAK TABEL EXP_PART (id-nummer, item_id-nummer, naam varchar2(20)) VERDELING DOOR RANGE (id, item_id) (partitie EXP_PART_1 waarden kleiner dan (10, 100), partitie EXP_PART_2 waarden kleiner dan (20, 200), partitie EXP_PART_3 waarden kleiner dan (30, 300), partitie EXP_PART_4 waarden kleiner dan (40, 400) ); Tabel gemaakt. SQL> MAAK INDEX test_idx OP EXP_PART (id, item_id) LOKAAL (partitie test_idx_1, partitie test_idx_2, partitie test_idx_3, partitie test_idx_4); Index gemaakt.SQL> SELECT indexnaam, partitienaam, status FROM user_ind_partitions waar index_name='TEST_IDX' ORDER BY index_name, partitienaam; INDEX_NAME PARTITION_NAME STATUS --------- ----------- ------ TEST_IDX IX_TEST_IDX_1 BRUIKBARE TEST_IDX IX_TEST_IDX_2 BRUIKBARE TEST_IDX IX_TEST_IDX_3 BRUIKBARE TEST_IDX IX_TESTABLE>Globaal gepartitioneerde indexen
- Een globale gepartitioneerde index is een index op een gepartitioneerde of niet-gepartitioneerde tabel die onafhankelijk is gepartitioneerd, d.w.z. met een andere partitiesleutel dan de tabel. Globaal gepartitioneerde indexen kunnen een bereik- of hashpartitie hebben.Globaal gepartitioneerde indexen zijn moeilijker te onderhouden dan lokale indexen. Ze bieden echter wel een efficiëntere toegangsmethode voor elk afzonderlijk record.
- Tijdens tabel- of indexinteractie tijdens partitieonderhoud worden alle partities in een globale index beïnvloed.
- Als op de onderliggende tabelpartitie SPLIT-, MOVE-, DROP- of TRUNCATE-onderhoudsbewerkingen zijn uitgevoerd, worden zowel globale indexen als globale gepartitioneerde indexen gemarkeerd als onbruikbaar. Hieruit volgt dat partitie-onafhankelijkheid niet mogelijk is voor globale indexen.
- Afhankelijk van het type bewerking dat op een tabelpartitie wordt uitgevoerd, worden de indexen op de tabel beïnvloed. Bij het wijzigen van een tabelpartitie kan de clausule UPDATE INDEXES worden opgegeven. Hierdoor worden automatisch de betrokken globale indexen en partities onderhouden.
- De voordelen van het gebruik van deze optie zijn dat de index online en beschikbaar blijft gedurende de hele operatie, en niet opnieuw hoeft te worden opgebouwd nadat de operatie is voltooid.
SQL> MAAK TABEL EXP_PART (id-nummer, item_id-nummer, naam varchar2(20)) VERDELING DOOR RANGE (id, item_id) (partitie EXP_PART_1 waarden kleiner dan (10, 100), partitie EXP_PART_2 waarden kleiner dan (20, 200), partitie EXP_PART_3 waarden kleiner dan (30, 300), partitie EXP_PART_4 waarden kleiner dan (40, 400) ); Tabel gemaakt. SQL> MAAK UNIEKE INDEX EXP_PART_IDX OP EXP_PART(id, item_id) GLOBALE PARTITIE PER BEREIK (id, item_id) (partitie EXP_PART_IDX_1 waarden kleiner dan (20, 200), partitie EXP_PART_IDX_2 waarden kleiner dan (maxvalue, maxvalue)); Index gemaakt.SQL> SELECT indexnaam, partitienaam, status FROM user_ind_partitions waar index_name='EXP_PART_IDX' ORDER BY index_name, partitienaam; INDEX_NAME PARTITION_NAME STATUS EXP_PART_IDX EXP_PART_IDX_1 BRUIKBAAR EXP_PART_IDX EXP_PART_IDX_2 BRUIKBAAR
Globale niet-gepartitioneerde indexen
- Globale niet-gepartitioneerde indexen bieden dezelfde efficiënte toegang tot elk individueel record in elke partitie en gedragen zich net als een niet-gepartitioneerde index. Aangezien de indexstructuur niet is gepartitioneerd, is de index beschikbaar voor alle partities.
- Een scenario waarin dit type index handig zou zijn, is met een query die de partitiesleutel van de tabel niet als filter bevat, maar je wilt toch dat de oracle-optimizer een index gebruikt
Veelgestelde vragen
Wat is de index met en zonder prefix?De index wordt prefix genoemd als de leidende kolom(men) in de indexdefinitie de partitiesleutelkolom(men) is (zijn), anders wordt het non-prefix genoemd.
Kunnen we de globale index onderverdelen?Nee, u kunt de globale index niet subpartitioneren, maar u kunt deze wel partitioneren. De enige manier om een index-subpartitie te krijgen, is door een sub-gepartitioneerde tabel te hebben met een lokale index
Hoe u kunt bepalen of een index globaal of lokaal isDoor de kolom LOCALITY op te vragen in DBA_PART_INDEXES.
Leest ook
- Zelfstudies voor Oracle-databasebeheer
- https://docs.oracle.com/en/database/oracle/oracle-database/18/vldbg/index-partitioning.html#GUID-569F94D0-E6E5-45BB-9626-5506DE18FF00
- datumformaat in orakel wijzigen