Tùy thuộc vào thay đổi mà bạn đang thực hiện, đôi khi có thể dễ dàng hơn trong thời gian bảo trì. Trong cửa sổ đó (nơi không ai có thể thay đổi dữ liệu trong bảng), bạn có thể:
- bỏ bất kỳ chỉ mục / ràng buộc nào trỏ đến cột cũ và tắt trình kích hoạt
- thêm một nullable mới cột với kiểu dữ liệu mới (ngay cả khi nó có nghĩa là KHÔNG ĐẦY ĐỦ)
- cập nhật cột mới, đặt cột này bằng với giá trị của cột cũ (và bạn có thể thực hiện việc này trong các phần giao dịch riêng lẻ (giả sử, ảnh hưởng đến 10000 hàng cùng một lúc bằng cách sử dụng
UPDATE TOP (10000) ... SET newcol = oldcol WHERE newcol IS NULL
) và với CHECKPOINT để tránh chạy quá tải nhật ký của bạn) - sau khi cập nhật xong, hãy bỏ cột cũ
- đổi tên cột mới (và thêm ràng buộc NOT NULL nếu thích hợp)
- xây dựng lại chỉ mục và cập nhật thống kê
Chìa khóa ở đây là nó cho phép bạn thực hiện cập nhật tăng dần trong bước 3, điều mà bạn không thể thực hiện trong một lệnh ALTER TABLE.
Điều này giả định rằng cột không đóng vai trò chính trong tính toàn vẹn của dữ liệu - nếu nó liên quan đến một loạt các mối quan hệ khóa ngoài, thì cần thực hiện thêm các bước.
CHỈNH SỬA
Ngoài ra, và tôi chỉ tự hỏi, tôi chưa thực hiện bất kỳ thử nghiệm nào cho điều này (nhưng thêm nó vào danh sách). Tôi tự hỏi liệu nén trang + hàng có giúp được gì ở đây không? Nếu bạn thay đổi INT thành BIGINT, với tính năng nén tại chỗ, SQL Server sẽ vẫn xử lý tất cả các giá trị như thể chúng vẫn phù hợp với INT. Một lần nữa, tôi chưa kiểm tra xem điều này có làm thay đổi nhanh hơn hay chậm hơn hay mất bao lâu để thêm nén ngay từ đầu. Chỉ cần ném nó ra khỏi đó.