Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да разберете в кой дял ще влезе ред, като се има предвид известна стойност на ключ на дял в Oracle?

С тези тестови данни

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

Както е описано тук https://jonathanlewis.wordpress.com/2009/11 /21/ora_hash-функция/

получавате

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   

Имайте предвид, че параметърът 3 в ora_hash е броят на (под)разделенията, изваден с 1. (=4-1). Ще трябва да извършите допълнителна обработка, ако броят на дяловете не е степен на две (което не е препоръчително), както е описано в препратката.

Можете да проверите резултата с изрична заявка за дял, както е показано по-долу

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

И разбира се работи и за нови ключове, нови за 1237 което не е в таблицата.

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 

„Предвиденият“ подраздел е R0_H1 , нека*да видим къде ще отиде INSERT:

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

Но използвайте с повишено внимание, тъй като това не е документирана от 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. Ограничава използването на ДАТА

  2. Връщането на Oracle в употреба в Java (JDBC, подготвено изявление)

  3. създайте таблица с последователност.nextval в oracle

  4. Функция SOUNDEX() в Oracle

  5. Не може да се включи в разпределена транзакция с NHibernate