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

Hvordan fortæller man hvilken partition en række vil gå ind i, givet en kendt partitionsnøgleværdi i Oracle?

Med disse testdata

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

Som beskrevet her https://jonathanlewis.wordpress.com/2009/11 /21/ora_hash-function/

du får

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   

Bemærk, at parameteren 3 i ora_hash er antallet af (under)partitioner fratrukket med 1. (=4-1). Du bliver nødt til at udføre yderligere behandling, hvis antallet af partitioner ikke er en potens af to (hvilket ikke anbefales) som beskrevet i referencen.

Du kan verificere resultatet med en eksplicit partitionsforespørgsel som nedenfor

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

Og det virker selvfølgelig også for nye nøgler, nye for 1237 som ikke er i tabellen.

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 

Den "forudsagte" underpartition er R0_H1 , lad*s se, hvor INSERT vil gå:

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

Men brug med forsigtighed, da det er IMO ikke dokumenteret funktion ...




  1. MySQL tæller kolonner på specifik værdi

  2. Hvordan kan jeg få emacs sql-mode til at bruge mysql-konfigurationsfilen (.my.cnf)?

  3. Hvorfor får jeg en dubletnøglefejl, når jeg opdaterer en række?

  4. sql pdo php hvor i variabel