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 ...