sql >> Databáze >  >> RDS >> Oracle

Jak zjistit, do kterého oddílu by šel řádek, vzhledem ke známé hodnotě klíče oddílu v Oracle?

S těmito testovacími daty

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

Jak je popsáno zde https://jonathanlewis.wordpress.com/2009/11 /21/ora_hash-function/

dostanete

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   

Všimněte si, že parametr 3 v ora_hash je počet (pod)oddílů odečtený 1. (=4-1). Pokud počet oddílů není mocninou dvou (což se nedoporučuje), budete muset provést další zpracování, jak je popsáno v odkazu.

Výsledek můžete ověřit pomocí explicitního dotazu na oddíl, jak je uvedeno níže

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

A samozřejmě to funguje i pro nové klíče, nově pro 1237 která není v tabulce.

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 

"Předpokládaný" pododdíl je R0_H1 , podívejme se*, kam se INSERT dostane:

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

Používejte však opatrně, protože to není IMO dokumentovaná funkce...




  1. JAK odstranit duplicitní data z výsledku pole PDO

  2. Nesprávná syntaxe poblíž 'PROCEDURE' postgresql

  3. Hledání volných slotů v rezervačním systému

  4. Automatizace tabulkového modelu zpracování databází Analysis Services (SSAS) na serveru SQL Server