2010-02-03 58 views
9

Tôi đang trong quá trình xây dựng kho lưu trữ cơ sở dữ liệu cho ứng dụng của mình bao gồm trên một bảng duy nhất với khối lượng dữ liệu khổng lồ (hàng trăm triệu bản ghi). Tôi đang lập kế hoạch có một chỉ mục trên trường ngày, vì tôi sẽ thực hiện khôi phục hàng loạt tất cả các bản ghi trong một khoảng thời gian nhất định sau đó (ví dụ, truy xuất tất cả các bản ghi cho ngày hôm sau, lúc nửa đêm).Phân vùng bảng động trong Oracle

Vì số lượng bản ghi rất lớn và hiệu suất là một mối quan tâm quan trọng trong hệ thống này, tôi muốn biết liệu có cách nào tôi có thể phân vùng động bảng của mình để có thể lấy lại các bản ghi nhanh hơn, tạo và cắt bớt phân vùng vì chúng không còn cần thiết nữa. Ví dụ, làm thế nào tôi sẽ đi về việc tạo một phân vùng cho ngày hôm sau và populating nó với phần còn lại của dữ liệu sau khi tôi đang xử lý xong các bản ghi ngày nay?

Trả lời

3

bạn có thể tự động hóa quá trình tạo hoặc cắt bớt phân vùng thông qua việc sử dụng dynamic SQL. Bạn sẽ viết các thủ tục với EXECUTE IMMEDIATE hoặc DBMS_SQL và bạn sẽ lập lịch biểu với DBMS_JOB hoặc DBMS_SCHEDULER (DBMS_SCHEDULER là tính năng 10g và linh hoạt hơn DBMS_JOB).

Bạn có thể muốn xây dựng các câu lệnh phân vùng theo cách thủ công trước và tự động hóa quy trình sau này khi bạn tự tin với DDL. Bạn sẽ tìm thấy tất cả các synthax trong documentation for the ALTER TABLE statement.

10

Trong 11g chúng ta có thể định nghĩa các phân vùng INTERVAL và Oracle sẽ tự động tạo phân vùng mới khi nó nhận được các bản ghi mới có khóa không phù hợp với bất kỳ phạm vi hiện có nào. Đây là một tính năng rất hay. Find out more.

Một điều cần ghi nhớ là Phân vùng là khoản phí bổ sung có thể tính phí trên giấy phép Phiên bản doanh nghiệp. Vì vậy, nó không phải là rẻ để sử dụng.

+2

+1 Việc giới thiệu phân vùng INTERVAL loại bỏ hầu hết nhu cầu về nhà các giải pháp phát triển để tự động quản lý việc bổ sung các phân vùng. Cải tiến duy nhất mà tôi muốn Oracle cung cấp là một số cách để định nghĩa một mặt nạ định dạng cho các tên phân vùng được tạo ra - chúng bây giờ được tạo ra với các tên do hệ thống tạo chung và tôi luôn phải xem cột LONG_VALUE trong x_tab_partitions để có thông tin có ý nghĩa về khoảng thời gian. – dpbradley

+0

@dpbradley - Tôi đã không may mắn để thực sự sử dụng phân vùng trong 11g cho thực tế, nhưng tôi có thể thấy rằng sẽ nhận được khá khó chịu. – APC

+0

Chỉ là một cảnh báo, bạn không thể trộn Phân vùng tham chiếu với phân vùng Khoảng thời gian. Chúng tôi đã chọn sử dụng phân vùng tham chiếu và sau đó quay tay một công việc để tạo phân vùng hàng tháng với quy ước đặt tên ưa thích của chúng tôi. – PenFold

1

Đây là ví dụ về thứ tôi đã tạo để tạo phân vùng bằng cách sử dụng SYSDATE và độ lệch. Tôi đã phải tạo các thông số thay thế bằng một chuỗi được nối với SYSDATE:

COLUMN temp_var new_value partition_name_01; 
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 3, 'YYYYMMDD') AS temp_var FROM dual; 
COLUMN temp_var new_value partition_date_01; 
SELECT TO_CHAR(SYSDATE - 3, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual; 
COLUMN temp_var new_value partition_name_02; 
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 2, 'YYYYMMDD') AS temp_var FROM dual; 
COLUMN temp_var new_value partition_date_02; 
SELECT TO_CHAR(SYSDATE - 2, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual; 
COLUMN temp_var new_value partition_name_03; 
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 1, 'YYYYMMDD') AS temp_var FROM dual; 
COLUMN temp_var new_value partition_date_03; 
SELECT TO_CHAR(SYSDATE - 1, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual; 
COLUMN temp_var new_value partition_name_04; 
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE, 'YYYYMMDD') AS temp_var FROM dual; 
COLUMN temp_var new_value partition_date_04; 
SELECT TO_CHAR(SYSDATE, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual; 
CREATE TABLE TABLE_NAME 
(
    SEQ_NO     NUMBER NOT NULL, 
    INSERT_DATE   DATE NOT NULL, 
    FIRST_NAME    VARCHAR2 (256 BYTE), 
    LAST_NAME    VARCHAR2 (256 BYTE), 
    ID_NUM     NUMBER, 
    ID_STATUS    NUMBER 
) 

PARTITION BY RANGE 
    (INSERT_DATE) 
    SUBPARTITION BY LIST 
     (ID_STATUS) 
     SUBPARTITION TEMPLATE (
     SUBPARTITION SP1 VALUES (0) TABLESPACE &tblspce, 
     SUBPARTITION SP2 VALUES (1) TABLESPACE &tblspce, 
     SUBPARTITION SP3 VALUES (2) TABLESPACE &tblspce) 

    (
    PARTITION &partition_name_01 
     VALUES LESS THAN 
     (TO_DATE ('&partition_date_01', 
        'SYYYY-MM-DD HH24:MI:SS', 
        'NLS_CALENDAR=GREGORIAN')), 

    PARTITION &partition_name_02 
     VALUES LESS THAN 
     (TO_DATE ('&partition_date_02', 
        'SYYYY-MM-DD HH24:MI:SS', 
        'NLS_CALENDAR=GREGORIAN')), 

    PARTITION &partition_name_03 
     VALUES LESS THAN 
     (TO_DATE ('&partition_date_03', 
        'SYYYY-MM-DD HH24:MI:SS', 
        'NLS_CALENDAR=GREGORIAN')), 
sysdate 

    PARTITION &partition_name_04 
     VALUES LESS THAN 
     (TO_DATE ('&partition_date_04', 
        'SYYYY-MM-DD HH24:MI:SS', 
        'NLS_CALENDAR=GREGORIAN'))) 

ENABLE ROW MOVEMENT; 
1

Có sản phẩm tự động xử lý nó. PartitionManager cho Oracle cung cấp quản lý phân vùng tự động, dựa trên việc lưu giữ tổ chức, bao gồm dọn dẹp và lưu trữ dữ liệu cũ, số liệu thống kê sao chép, vv Bạn có thể dùng thử tại http://www.xyrosoft.com

+0

Trong những cách này là một sự cải tiến hơn những gì Oracle đã cung cấp? –

Các vấn đề liên quan