sql >> Databasteknik >  >> RDS >> Oracle

Oracle partitionsindex

I den tidigare artikeln lärde vi oss om Oracle partitionerad tabell. I fortsättningen på den serien kommer jag här att presentera Oracles partitionsindex

Här är några fakta om att förstå partitionerade index

Lokala partitionsindex

  • Ett lokalt index på en partitionerad tabell skapas där indexet är partitionerat på exakt samma sätt som den underliggande partitionerade tabellen. Det vill säga att det lokala indexet ärver tabellens partitioneringsmetod. Detta är känt som equi-partitionering.
  • För lokala index kommer indexnycklarna i indexet endast att referera till raderna som är lagrade i den enda underliggande tabellpartitionen. Ett lokalt index skapas genom att specificera attributet LOCAL och kan skapas som UNIKT eller ICKE-UNIKT.
  • Tabellen och det lokala indexet är antingen partitionerade på exakt samma sätt eller har samma partitionsnyckel eftersom de lokala indexen underhålls automatiskt, kan erbjuda högre tillgänglighet.
  • Eftersom Oracle-databasen säkerställer att indexpartitionerna är synkroniserade med deras motsvarande tabellpartitioner, följer det att databasen automatiskt underhåller indexpartitionen närhelst någon underhållsåtgärd utförs på de underliggande tabellerna
  • till exempel när partitioner läggs till, tas bort eller slås samman.
  • Ett lokalt index har prefix om partitionsnyckeln för tabellen och indexnyckeln är samma; annars är det ett lokalt index utan prefix
SQL> CREATE TABLE EXP_PART (id number, item_id number, name varchar2(20))
  PARTITION BY RANGE (id, item_id)
  (partition EXP_PART_1 values less than (10, 100),
  partition EXP_PART_2 values less than (20, 200),
  partition EXP_PART_3 values less than (30, 300),
  partition EXP_PART_4 values less than (40, 400));
 Table created.

 SQL> CREATE INDEX test_idx ON EXP_PART(id, item_id)
  LOCAL
  (partition test_idx_1,
  partition test_idx_2,
  partition test_idx_3,
  partition test_idx_4);
 Index created.

SQL> SELECT index_name, partition_name, status
  FROM user_ind_partitions where index_name='TEST_IDX'
  ORDER BY index_name, partition_name;
 INDEX_NAME PARTITION_NAME STATUS
 ---------   -----------    ------
 TEST_IDX IX_TEST_IDX_1 USABLE
 TEST_IDX IX_TEST_IDX_2 USABLE
 TEST_IDX IX_TEST_IDX_3 USABLE
 TEST_IDX IX_TEST_IDX_4 USABLE

Globala partitionerade index

  • Ett globalt partitionerat index är ett index på en partitionerad eller icke-partitionerad tabell som är partitionerad oberoende, d.v.s. använder en annan partitioneringsnyckel än tabellen. Globalt partitionerade index kan vara intervall- eller hashpartitionerade. Globala partitionerade index är svårare att underhålla än lokala index. Men de erbjuder en effektivare åtkomstmetod till varje enskild post.
  • Under tabell- eller indexinteraktion under partitionsunderhåll kommer alla partitioner i ett globalt index att påverkas.
  • När den underliggande tabellpartitionen har några SPLIT-, MOVE-, DROP- eller TRUNCATE-underhållsåtgärder utförda på sig, kommer både globala index och globala partitionerade index att markeras som oanvändbara. Det följer därför att partitionsoberoende är det inte möjligt för globala index.
  • Beroende på vilken typ av operation som utförs på en tabellpartition, kommer indexen på tabellen att påverkas. När du ändrar en tabellpartition kan UPDATE INDEXES-satsen specificeras. Detta bibehåller automatiskt de berörda globala indexen och partitionerna.
  • Fördelarna med att använda det här alternativet är att indexet förblir online och tillgängligt under hela operationen och behöver inte byggas om när operationen har slutförts.
SQL> CREATE TABLE EXP_PART (id number, item_id number, name varchar2(20))
  PARTITION BY RANGE (id, item_id)
  (partition EXP_PART_1 values less than (10, 100),
  partition EXP_PART_2 values less than (20, 200),
  partition EXP_PART_3 values less than (30, 300),
  partition EXP_PART_4 values less than (40, 400));
 Table created.

 SQL> CREATE UNIQUE INDEX EXP_PART_IDX ON EXP_PART(id, item_id)
  GLOBAL PARTITION BY RANGE (id, item_id)
  (partition EXP_PART_IDX_1 values less than (20, 200),
   partition EXP_PART_IDX_2 values less than (maxvalue, maxvalue));
 Index created.

SQL> SELECT index_name, partition_name, status
  FROM user_ind_partitions where index_name='EXP_PART_IDX'
  ORDER BY index_name, partition_name;
 INDEX_NAME PARTITION_NAME STATUS
 
 EXP_PART_IDX EXP_PART_IDX_1 USABLE
 EXP_PART_IDX EXP_PART_IDX_2 USABLE

Globala icke-partitionerade index

  • Globala icke-partitionerade index erbjuder samma effektiva åtkomst till varje enskild post i vilken partition som helst, och beter sig precis som ett icke-partitionerat index. Eftersom indexstrukturen inte är partitionerad är indexet tillgängligt för alla partitioner.
  • Ett scenario där den här typen av index skulle vara användbar är med en fråga som inte innehåller tabellens partitionsnyckel som ett filter, men du vill fortfarande att Oracle Optimizer ska använda ett index

Vanliga frågor

Vad är indexet med och utan prefix?

Indexet kallas prefix om den eller de inledande kolumnerna i indexdefinitionen är partitionsnyckelkolumnerna, annars kallas det icke-prefix.

Kan vi underpartitionera det globala indexet?

Nej, du kan inte underpartitionera globalt index, men du kan partitionera det. Det enda sättet att sluta med indexunderpartition är att ha en underpartitionerad tabell med lokalt index

Hur du hittar om ett index är globalt eller lokalt

Genom att fråga kolumnen LOCALITY i DBA_PART_INDEXES.

Läser också

  • Handledningar för Oracle-databasadministration
  • https://docs.oracle.com/en/database/oracle/oracle-database/18/vldbg/index-partitioning.html#GUID-569F94D0-E6E5-45BB-9626-5506DE18FF00
  • ändra datumformat i Oracle


  1. Hur OCTET_LENGTH() fungerar i MariaDB

  2. FORMAT() Exempel i MySQL

  3. Undvika PostgreSQL dödlägen när du utför massuppdateringar och raderingsåtgärder

  4. Sekvens vs identitet