Oracle
 sql >> Base de données >  >> RDS >> Oracle

Indice de partition Oracle

Dans l'article précédent, nous avons découvert la table partitionnée Oracle. Dans la continuité de cette série, je vais présenter ici l'index de partition Oracle

Voici quelques faits sur la compréhension des index partitionnés

Index de partition locale

  • Un index local sur une table partitionnée est créé où l'index est partitionné exactement de la même manière que la table partitionnée sous-jacente. Autrement dit, l'index local hérite de la méthode de partitionnement de la table. C'est ce qu'on appelle l'équipartitionnement.
  • Pour les index locaux, les clés d'index dans l'index ne feront référence qu'aux lignes stockées dans la partition de table sous-jacente unique. Un index local est créé en spécifiant l'attribut LOCAL et peut être créé comme UNIQUE ou NON-UNIQUE.
  • La table et l'index local sont soit partitionnés exactement de la même manière, soit ont la même clé de partition car les index locaux sont automatiquement maintenus, ce qui peut offrir une plus grande disponibilité.
  • Comme la base de données Oracle garantit que les partitions d'index sont synchronisées avec leurs partitions de table correspondantes, il s'ensuit que la base de données maintient automatiquement la partition d'index chaque fois qu'une opération de maintenance est effectuée sur les tables sous-jacentes
  • par exemple, lorsque des partitions sont ajoutées, supprimées ou fusionnées.
  • Un index local est préfixé si la clé de partition de la table et la clé d'index sont identiques ; sinon c'est un index local sans préfixe
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

Index partitionnés globaux

  • Un index partitionné global est un index sur une table partitionnée ou non partitionnée qui est partitionnée indépendamment, c'est-à-dire en utilisant une clé de partitionnement différente de la table. Les index partitionnés globaux peuvent être partitionnés par plage ou par hachage. Les index partitionnés globaux sont plus difficiles à gérer que les index locaux. Cependant, ils offrent une méthode d'accès plus efficace à n'importe quel enregistrement individuel.
  • Lors de l'interaction de la table ou de l'index lors de la maintenance des partitions, toutes les partitions d'un index global seront affectées.
  • Lorsque des opérations de maintenance SPLIT, MOVE, DROP ou TRUNCATE sont effectuées sur la partition de table sous-jacente, les index globaux et les index partitionnés globaux seront marqués comme inutilisables. Il s'ensuit donc que l'indépendance des partitions n'est pas possible pour les index globaux.
  • Selon le type d'opération effectuée sur une partition de table, les index de la table seront affectés. Lors de la modification d'une partition de table, la clause UPDATE INDEXES peut être spécifiée. Cela maintient automatiquement les index globaux et les partitions affectés.
  • Les avantages de l'utilisation de cette option sont que l'index reste en ligne et disponible tout au long de l'opération, et n'a pas besoin d'être reconstruit une fois l'opération terminée.
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

Index globaux non partitionnés

  • Les index non partitionnés globaux offrent le même accès efficace à n'importe quel enregistrement individuel dans n'importe quelle partition et se comportent comme un index non partitionné. Comme la structure de l'index n'est pas partitionnée, l'index est disponible pour toutes les partitions.
  • Un scénario où ce type d'index serait utile est avec une requête qui n'inclut pas la clé de partition de la table comme filtre, mais vous voulez toujours que l'optimiseur Oracle utilise un index

FAQ

Qu'est-ce que l'index préfixé et non préfixé ?

L'index est dit préfixé si la ou les colonnes de tête dans la définition de l'index est (sont) la ou les colonne(s) de clé de partition, sinon il est dit non préfixé.

Pouvons-nous sous-partitionner l'index global ?

Non, vous ne pouvez pas sous-partitionner l'index global, mais vous pouvez le partitionner. La seule façon de se retrouver avec une sous-partition d'index est d'avoir une table sous-partitionnée avec un index local

Comment déterminer si un index est global ou local

En interrogeant la colonne LOCALITY dans DBA_PART_INDEXES.

Lit également

  • Tutoriels d'administration de la base de données Oracle
  • https://docs.oracle.com/en/database/oracle/oracle-database/18/vldbg/index-partitioning.html#GUID-569F94D0-E6E5-45BB-9626-5506DE18FF00
  • changer le format de date dans oracle