Cập nhật 700 triệu hàng thành cùng giá trị


12

Tôi đã có một kho dữ liệu (oracle) nơi tôi cần đặt một cột có cùng giá trị cho tất cả 700 triệu hàng.

Tôi không có quyền truy cập quản trị viên hoặc quyền truy cập vào quản trị viên, vì vậy điều này cần phải được thực hiện với sql cơ bản và không có bảng tạm thời nào tạo ra.

Vấn đề phức tạp hơn nữa là nếu tôi cố gắng chỉ thực hiện một bản cập nhật đơn giản trong đó 1 = 1, nó sẽ hết dung lượng.

Cách tôi có nó chạy ngay bây giờ là lặp như thế này:

loop
  update mytable set mycolumn = '1' where mycolumn is null and rownum < 50000;
  commit;
end loop

nhưng tôi biết điều này có lẽ là ngây thơ và phải có một giải pháp nhanh hơn và thanh lịch hơn.


Bảng có được phân vùng không?
Jack nói hãy thử topanswers.xyz

Tôi không tin như vậy. Có một vài chỉ mục, nhưng không có chỉ mục nào liên quan đến cột tôi đang cập nhật.
owook

Câu trả lời:


4

Nếu bạn có không gian, bạn có thể CTAS bằng cách sử dụng hoàn tác / làm lại tối thiểu . Nếu bạn có bất kỳ chỉ mục nào, thực hiện bất kỳ cách nào khác sẽ rất chậm và tạo ra đăng nhập như điên.

Trong trường hợp bạn có một IOT duy nhất mà không có bất kỳ chỉ mục phụ hoặc cụm bảng đơn nào, bạn có thể bước qua khóa chính / cụm cập nhật trong các khối mà không phải quét lại toàn bộ bảng để tìm các trường chưa được cập nhật.

--biên tập

Tôi không thể tạo bảng phụ ... Có một vài chỉ mục, nhưng không có chỉ mục nào liên quan đến cột tôi đang cập nhật.

Sau đó, tôi khuyên bạn nên chia bảng thành các khối để xử lý bằng cách sử dụng thứ gì đó mà bạn đang lập chỉ mục (ngay cả khi đó là một cột duy nhất, bạn có thể chia nó thành các phạm vi giá trị) Điều này sẽ thực hiện FTS một lần thay vì một lần cho mỗi khối như trong mã. Bạn sẽ phải sống với rất nhiều công việc làm lại và cũng sẽ xóa sạch không gian hoàn tác của bạn (vì vậy không có hồi tưởng sau đó)

--edit2

Nếu bạn có thể thêm / đổi tên / thả cột, bạn có thể thực hiện việc này rất hiệu quả , nhưng chỉ trong 11g


1
Nếu DBA của bạn cho phép bạn làm NOLOGGING, điều đó sẽ làm mất hiệu lực các hotstandbys.
Gaius

Thật vậy, và một bản sao lưu sau đó cũng là một ý tưởng hay - nhưng đây là một nhà kho và nologginglà một công cụ để lưu trữ
Jack nói hãy thử topanswers.xyz

Tôi không thể tạo một bảng phụ, chắc chắn không phải là bảng lớn như bảng đầu tiên, ngay cả khi chỉ là tạm thời.
owook

Liên kết 11g của bạn có vẻ đầy hứa hẹn, nhưng tôi thấy các nhận xét trong đó cho một bảng 60m, nó vẫn chậm khủng khiếp vì phải đặt giá trị cho mỗi hàng. Vì bảng của tôi có kích thước gấp 10 lần, nên phương pháp đó có thể không phải là một sự cải tiến.
owook

@owook không, vào 11g thao tác này nhanh chóng và không đặt giá trị cho mỗi hàng "cho một số loại bảng (ví dụ: các bảng không có cột LOB)" . Hãy thử nó trên một tập hợp con của bảng của bạn ( create table foo as select * from bar where rownum<100000)
Jack nói hãy thử topanswers.xyz

1

Nếu bạn ở trên 11g, hãy thả cột và thêm lại dưới dạng cột KHÔNG NULL với giá trị mặc định. Điều này là phản trực giác, nhưng Oracle sẽ lưu trữ giá trị mặc định trong định nghĩa của bảng, thay thế giá trị mặc định trong thời gian chạy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.