Tôi không có câu trả lời "tốt nhất", nhưng tôi có câu trả lời "ít tệ nhất" có thể cho phép bạn hoàn thành công việc một cách hợp lý nhanh chóng.
Bảng của tôi có các hàng 2MM và hiệu suất cập nhật bị rối khi tôi cố thêm cột dấu thời gian thứ cấp mặc định vào cột đầu tiên.
ALTER TABLE mytable ADD new_timestamp TIMESTAMP ;
UPDATE mytable SET new_timestamp = old_timestamp ;
ALTER TABLE mytable ALTER new_timestamp SET NOT NULL ;
Sau khi nó được treo trong 40 phút, tôi đã thử điều này trên một lô nhỏ để có ý tưởng về việc điều này có thể kéo dài bao lâu - dự báo là khoảng 8 giờ.
Câu trả lời được chấp nhận chắc chắn tốt hơn - nhưng bảng này được sử dụng nhiều trong cơ sở dữ liệu của tôi. Có vài chục bảng FKEY trên đó; Tôi muốn tránh chuyển các phím NGOẠI TỆ trên rất nhiều bảng. Và sau đó là quan điểm.
Một chút tìm kiếm tài liệu, nghiên cứu trường hợp và StackOverflow, và tôi đã có "A-Ha!" chốc lát. Cống không nằm trong CẬP NHẬT cốt lõi, mà trên tất cả các hoạt động INDEX. Bảng của tôi có 12 chỉ mục trên đó - một số cho các ràng buộc duy nhất, một số để tăng tốc trình lập kế hoạch truy vấn và một số cho tìm kiếm toàn văn bản.
Mỗi hàng được CẬP NHẬT không chỉ hoạt động trên XÓA / XÁC NHẬN, mà còn là chi phí thay đổi từng chỉ số và kiểm tra các ràng buộc.
Giải pháp của tôi là bỏ mọi chỉ mục và ràng buộc, cập nhật bảng, sau đó thêm tất cả các chỉ mục / ràng buộc trở lại.
Mất khoảng 3 phút để viết một giao dịch SQL đã làm như sau:
- BẮT ĐẦU;
- giảm chỉ số / chòm sao
- bảng cập nhật
- thêm lại các chỉ mục / ràng buộc
- CAM KẾT;
Kịch bản mất 7 phút để chạy.
Câu trả lời được chấp nhận chắc chắn là tốt hơn và đúng đắn hơn ... và hầu như loại bỏ sự cần thiết của thời gian chết. Tuy nhiên, trong trường hợp của tôi, sẽ cần nhiều công việc "Nhà phát triển" hơn để sử dụng giải pháp đó và chúng tôi đã có một cửa sổ thời gian ngừng hoạt động 30 phút mà nó có thể được thực hiện. Giải pháp của chúng tôi đã giải quyết trong 10.
ALTER TABLE .. ADD COLUMN ...
hoặc là phần đó sẽ được trả lời là tốt?