Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào để biết một hàng sẽ đi vào phân vùng nào, với một giá trị khóa phân vùng đã biết trong Oracle?

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:nhập các bản ghi từ tệp văn bản được phân cách bằng tab vào cơ sở dữ liệu bằng pl-sql

  2. Oracle:Sự khác biệt giữa chuỗi NULL và EMPTY

  3. SELECT * FROM TABLE (hàm pipelined):tôi có thể chắc chắn về thứ tự của các hàng trong kết quả không?

  4. Oracle - chữ không khớp với lỗi chuỗi định dạng

  5. Truy vấn kiểm tra kích thước bảng trong cơ sở dữ liệu Oracle