2014-10-16 22 views
7

chúng tôi có một bảng có 10 tỷ hàng. Bảng này là Khoảng thời gian được phân vùng vào ngày. Trong phân mục con, chúng ta cần cập nhật ngày cho 500 triệu hàng khớp với tiêu chí cho một giá trị mới. Điều này chắc chắn sẽ ảnh hưởng đến việc tạo phân vùng mới hoặc thứ gì đó vì bảng được phân đoạn trên cùng một ngày. Bất cứ ai có thể cho tôi con trỏ đến một cách tiếp cận tốt nhất để làm theo?Cập nhật giá trị cột cho 500 triệu hàng trong Bảng phân đoạn khoảng thời gian

Cảm ơn trước!

Trả lời

0

hmmm ... Nếu bạn có đủ không gian, tôi sẽ tạo "bản sao" của bảng nguồn với hàng được cập nhật tốt, sau đó kiểm tra kết quả và thả bảng nguồn sau đó, cuối cùng đổi tên "bản sao" cho nguồn. Có điều này có một thời gian thực hiện dài, nhưng điều này có thể là một cách không đau, tất nhiên gợi ý song song là cần thiết.

+0

Bạn có thực sự đề xuất sao chép toàn bộ 10 tỷ hàng không? Hay bạn đang nói về trao đổi phân vùng? –

+0

vâng, bạn nói đúng, bạn cần phải "thay thế" các phân vùng bị ảnh hưởng cập nhật – Thomas

1

Nếu bạn đang đi để cập nhật phân vùng chính và nguồn hàng đang ở trong một (sub) phân vùng duy nhất, sau đó là cách tiếp cận hợp lý sẽ được:

  1. Tạo một bảng tạm thời cho các hàng được cập nhật. Nếu có thể, hãy thực hiện cập nhật một cách nhanh chóng

    CREATE TABLE updated_rows 
    AS 
    SELECT add_months(partition_key, 1), other_columns... 
        FROM original_table PARITION (xxx) 
    WHERE ...; 
    
  2. Drop gốc (sub) phân vùng

    ALTER TABLE original_table DROP PARTITION xxx; 
    
  3. Lắp các hàng được cập nhật trở lại

    INSERT /*+append*/ INTO original_table 
    SELECT * FROM updated_rows; 
    

Trong trường hợp bạn có các vấn đề với CTAS hoặc INSERT INTO SELECT cho 500M hàng, xem xét phân vùng bảng tạm thời và di chuyển dat theo lô.

+0

@ Tìm ra cách làm tốt. Nhưng không thể hoàn thành thao tác chèn cho hàng triệu hàng. – pratikch

0

Bạn có thể xem xét thêm một cột mới (Cờ) 'cập nhật' bit bằng cách chèn giá trị NULL (Hoặc 0, i preffer NULL) vào bảng của bạn và sử dụng những lời chỉ trích của ngày bạn cần cập nhật có thể cập nhật nhóm dữ liệu theo nhóm theo cùng một cách được mô tả bởi Kombajn, khi nhóm dữ liệu được cập nhật, bạn có thể ảnh hưởng đến giá trị 1 tới cờ 'được cập nhật' cho nhóm dữ liệu của bạn.

Ví dụ, hãy bắt đầu bằng cách tạo các nhóm dữ liệu, hãy lưu ý rằng điểm kỳ quặc của các nhóm là năm. vì vậy hãy bắt đầu xử lý dữ liệu theo năm.

  1. Tạo một bảng tạm thời của năm 1:

CREATE TABLE updated_rows AS SELECT columns... FROM original_table PARITION (2001) WHERE YEAR = 2001 ...;

2.Drop gốc (sub) phân vùng

ALTER TABLE original_table DROP PARTITION 2001;

3.Reinsert các hàng được cập nhật trở lại

INSERT /*+append*/ INTO original_table(columns....,updated) SELECT columns...,1 FROM updated_rows;

Hy vọng điều này sẽ giúp bạn xử lý dữ liệu từng bước để ngăn việc chờ đợi tất cả dữ liệu của bảng được cập nhật cùng một lúc. Bạn có thể xem xét một con trỏ lặp qua nhiều năm.

+0

Điều này khác với [câu trả lời này] (http://stackoverflow.com/a/26474008/458741) từ 4 ngày trước? – Ben

+0

sẽ ngăn bạn cập nhật phần lớn bảng của bạn một phần (Sử dụng các phê bình của phân vùng) thay vì cùng một lúc => ít không gian được sử dụng trên tệp nhật ký (bạn có thể làm trống tệp nhật ký giữa các giao dịch). Tôi không đề xuất một giải pháp mới, nó giống như một đề xuất của Kombajn, nó có vẻ là một giải pháp tốt nhưng không đầy đủ với tôi. –

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