sql >> Databasteknik >  >> RDS >> Oracle

Hur avgör man vilken partition en rad skulle gå in i, givet ett känt partitionsnyckelvärde i Oracle?

Med denna testdata

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

Som beskrivs här 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   

Observera att parametern 3 i ora_hash är antalet (under)partitioner subtraherade med 1. (=4-1). Du måste göra ytterligare bearbetning om antalet partitioner inte är en potens av två (vilket inte rekommenderas) som beskrivs i referensen.

Du kan verifiera resultatet med en explicit partitionsfråga enligt nedan

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

Och naturligtvis fungerar det också för nya nycklar, nya för 1237 som inte finns 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 "förutspådda" underpartitionen är R0_H1 , låt*s se vart INSERT tar vägen:

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

Men använd med försiktighet, eftersom det inte är IMO-dokumenterad funktion ...




  1. MySQLi :Infoga flera rader med en förberedd sats

  2. vad är det för fel på denna Magento-fråga?

  3. PlanetScale &Vitess:referensintegritet med äldre delade databaser

  4. Flera index vs index med flera kolumner