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

Comment savoir dans quelle partition une ligne irait, étant donné une valeur de clé de partition connue dans Oracle ?

Avec ces données de test

INSERT INTO foos VALUES (1234, SYSDATE);
INSERT INTO foos VALUES (1235, SYSDATE);
INSERT INTO foos VALUES (1236, SYSDATE);

Comme décrit ici https://jonathanlewis.wordpress.com/2009/11 /21/ora_hash-function/

vous obtenez

with hsh as (
select  BATCH_ID, ora_hash(BATCH_ID, 3)+1 subpartition_position  from foos)
select BATCH_ID, SUBPARTITION_POSITION,
(select subpartition_name from   user_tab_subpartitions where   table_name = 'FOOS' and SUBPARTITION_POSITION = hsh.SUBPARTITION_POSITION) subpartition_name
from hsh;

  BATCH_ID SUBPARTITION_POSITION SUBPARTITION_NAME            
---------- --------------------- ------------------------------
      1236                     1 R0_H0                          
      1235                     3 R0_H2                          
      1234                     4 R0_H3   

Notez que le paramètre 3 dans ora_hash est le nombre de (sous)partitions soustrait de 1. (=4-1). Vous devrez effectuer un traitement supplémentaire si le nombre de partitions n'est pas une puissance de deux (ce qui n'est pas recommandé) comme décrit dans la référence.

Vous pouvez vérifier le résultat avec une requête de partition explicite comme ci-dessous

select * from foos subpartition( R0_H0 ); --   1236
select * from foos subpartition( R0_H1 ); --   empty
select * from foos subpartition( R0_H2 ); --   1235
select * from foos subpartition( R0_H3 ); --   1234

Et bien sûr, cela fonctionne aussi pour les nouvelles clés, nouveau pour 1237 qui n'est pas dans le tableau.

with hsh as (
select  1237 BATCH_ID, ora_hash(1237, 3)+1 subpartition_position  from dual)
select BATCH_ID, SUBPARTITION_POSITION,
(select subpartition_name from   user_tab_subpartitions where   table_name = 'FOOS' and SUBPARTITION_POSITION = hsh.SUBPARTITION_POSITION) subpartition_name
from hsh;

  BATCH_ID SUBPARTITION_POSITION SUBPARTITION_NAME            
---------- --------------------- ------------------------------
      1237                     2 R0_H1 

La sous-partition "prédite" est R0_H1 , voyons où ira l'INSERT :

INSERT INTO foos VALUES (1237, SYSDATE);      
select * from foos subpartition( R0_H1 ); --  1237

Mais à utiliser avec prudence, car il s'agit d'une fonctionnalité non documentée par l'OMI...