Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak stwierdzić, do której partycji przejdzie wiersz, biorąc pod uwagę znaną wartość klucza partycji w Oracle?

Z tymi danymi testowymi

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

Jak opisano tutaj https://jonathanlewis.wordpress.com/2009/11 /21/ora_funkcja-hash/

dostajesz

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   

Zwróć uwagę, że parametr 3 w ora_hash to liczba (pod)partycji odjęta przez 1. (=4-1). Będziesz musiał wykonać dodatkowe przetwarzanie, jeśli liczba partycji nie jest potęgą dwójki (co nie jest zalecane), jak opisano w odnośniku.

Możesz zweryfikować wynik za pomocą jawnego zapytania o partycję, jak poniżej

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

I oczywiście działa również dla nowych kluczy, nowość dla 1237 których nie ma w tabeli.

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 

Przewidywana podpartycja to R0_H1 , zobaczmy, gdzie trafi INSERT:

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

Ale należy zachować ostrożność, ponieważ jest to funkcja nieudokumentowana przez IMO ...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PL/SQL — Jak używać tablicy w klauzuli IN

  2. ORA-03113:koniec pliku na kanale komunikacyjnym

  3. varchar2(n BYTE|CHAR) default -> CHAR lub BYTE

  4. JDBC Oracle — Pobieranie planu wyjaśnień dla zapytania

  5. Wstawianie danych do tabeli za pomocą Execute Immediate w Oracle