Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como saber em qual partição uma linha entraria, dado um valor de chave de partição conhecido no Oracle?


Com esses dados de teste
INSERT INTO foos VALUES (1234, SYSDATE);
INSERT INTO foos VALUES (1235, SYSDATE);
INSERT INTO foos VALUES (1236, SYSDATE);

Conforme descrito aqui https://jonathanlewis.wordpress.com/2009/11 /21/ora_hash-function/

você consegue
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   

Observe que o parâmetro 3 em ora_hash é o número de (sub)partições subtraído por 1. (=4-1). Você terá que fazer processamento adicional se o número de partição não for uma potência de dois (o que não é recomendado) conforme descrito na referência.

Você pode verificar o resultado com uma consulta de partição explícita como abaixo
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 é claro que também funciona para novas chaves, novas para 1237 que não está na tabela.
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 

A subpartição "prevista" é R0_H1 , vamos ver onde o INSERT irá:
INSERT INTO foos VALUES (1237, SYSDATE);      
select * from foos subpartition( R0_H1 ); --  1237

Mas use com cuidado, pois é um recurso não documentado pela IMO...