Oracle
 sql >> Database >  >> RDS >> Oracle

Come sapere in quale partizione andrebbe una riga, dato un valore di chiave di partizione noto in Oracle?

Con questi dati di prova

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

Come descritto qui https://jonathanlewis.wordpress.com/2009/11 /21/ora_funzione-hash/

ottieni

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   

Tieni presente che il parametro 3 in ora_hash è il numero di (sotto)partizioni sottratte per 1. (=4-1). Dovrai eseguire un'elaborazione aggiuntiva se il numero di partizioni non è una potenza di due (cosa non consigliata) come descritto nel riferimento.

Puoi verificare il risultato con una query di partizione esplicita come di seguito

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

E ovviamente funziona anche con nuove chiavi, nuove per 1237 che non è nella tabella.

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 sottopartizione "prevista" è R0_H1 , vediamo* dove andrà l'INSERT:

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

Ma usa con cautela, poiché è una funzionalità IMO non documentata ...