Với dữ liệu thử nghiệm này
INSERT INTO foos VALUES (1234, SYSDATE);
INSERT INTO foos VALUES (1235, SYSDATE);
INSERT INTO foos VALUES (1236, SYSDATE);
Như được mô tả ở đây https://jonathanlewis.wordpress.com/2009/11 / 21 / ora_hash-function /
bạn nhận được
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
Lưu ý rằng tham số 3 trong ora_hash
là số phân vùng (con) trừ đi 1. (=4-1). Bạn sẽ phải thực hiện xử lý bổ sung nếu số lượng phân vùng không phải là lũy thừa của hai (không được khuyến nghị đặt) như được mô tả trong tài liệu tham khảo.
Bạn có thể xác minh kết quả bằng một truy vấn phân vùng rõ ràng như bên dưới
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
Và tất nhiên, nó cũng hoạt động cho các khóa mới, mới cho 1237 mà không có trong bảng.
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
Phân vùng con "được dự đoán" là R0_H1
, hãy * s xem INSERT sẽ đi đến đâu:
INSERT INTO foos VALUES (1237, SYSDATE);
select * from foos subpartition( R0_H1 ); -- 1237
Nhưng hãy sử dụng một cách thận trọng, vì đây là IMO không phải là tính năng được ghi lại ...