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...