Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana cara mengetahui partisi mana yang akan dimasukkan ke dalam baris, dengan nilai kunci partisi yang diketahui di Oracle?

Dengan data uji ini

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

Seperti yang dijelaskan di sini https://jonathanlewis.wordpress.com/2009/11 /21/ora_hash-function/

Anda mendapatkan

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   

Perhatikan bahwa parameter 3 di ora_hash adalah jumlah (sub) partisi dikurangi dengan 1. (=4-1). Anda harus melakukan pemrosesan tambahan jika jumlah partisi bukan pangkat dua (yang tidak direkomendasikan) seperti yang dijelaskan dalam referensi.

Anda dapat memverifikasi hasilnya dengan kueri partisi eksplisit seperti di bawah ini

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

Dan tentu saja ini juga berfungsi untuk kunci baru, baru untuk 1237 yang tidak ada di tabel.

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 

Subpartisi "diprediksi" adalah R0_H1 , mari kita lihat ke mana arah INSERT:

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

Tetapi gunakan dengan hati-hati, karena ini adalah fitur IMO yang tidak didokumentasikan ...




  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 menyimpan prosedur keluar kursor ke VBA ADODB.RecordSet?

  2. Skema Bintang vs Kepingan Salju di pergudangan data?

  3. ORA-21700:objek tidak ada atau ditandai untuk dihapus untuk Associative Array sebagai parameter input yang dipanggil dari ODP.NET

  4. SQL. Bagaimana cara mereferensikan Oracle kunci utama komposit?

  5. SQL Query untuk menggabungkan nilai kolom dari beberapa baris di Oracle