Tăng cột thay đổi tốc độ trên bàn lớn lên NON NULL


12

Gần đây tôi đã thêm một cột bit có khả năng NULL vào một bảng có gần 500 triệu hàng. Không có mặc định trên cột, tuy nhiên tất cả các phần chèn đều chỉ định giá trị 0 hoặc 1 và tôi đã chạy một thói quen một lần để gán 0 hoặc 1 cho tất cả các hàng hiện có (cập nhật các hàng theo lô nhỏ). Mỗi hàng bây giờ sẽ có 0 hoặc 1 trong cột đó.

Tôi muốn làm cho cột bit không thể rỗng, tuy nhiên khi tôi thử thực hiện thông qua ALTER TABLE t1 ALTER COLUMN c1 bit not null, nó bắt đầu chạy trong 3 phút và tôi đã dừng nó vì nó chặn tất cả các lần đọc vào bảng và tôi nghi ngờ sẽ mất nhiều thời gian để hoàn thành . Có thể nó sẽ không mất nhiều thời gian nhưng tôi không thể mạo hiểm quá nhiều. Bản rollback mất 6 phút.

Bạn có bất cứ đề xuất nào về cách tôi có thể làm cho cột không thể rỗng mà không mất nhiều giờ để hoàn thành không? Ngoài ra, có cách nào để ước tính thời gian ALTER TABLE ALTER COLUMNtuyên bố tôi bắt đầu và sau đó bị hủy sẽ mất bao lâu để hoàn thành?

Tôi đang sử dụng SQL Server 2017 Phiên bản web.

Câu trả lời:


12

Thay vì thay đổi định nghĩa cột, bạn có thể thêm một CHECK CONSTRAINTđịnh nghĩa không cho phép NULL cho cột đó. Bảng sẽ vẫn cần được quét nhưng nó sẽ không cần sửa đổi mỗi trang dữ liệu, vì vậy nó sẽ hoạt động nhanh hơn nhiều. Đáng tiếc, khóa Sch-M vẫn sẽ được giữ trong quá trình hoạt động. Một mẹo nhỏ là cố gắng đưa càng nhiều bảng vào nhóm bộ đệm càng tốt trước khi thử thêm ràng buộc. Điều đó có thể làm giảm thời gian khóa Sch-M được giữ.

Sau đó, bạn có thể loại bỏ ràng buộc và thay đổi định nghĩa cột trong cửa sổ bảo trì tiếp theo của bạn.


Cảm ơn Joe vì ý tưởng. Tôi gần như đã đi kèm với việc thêm một ràng buộc kiểm tra nhưng có một cửa sổ bảo trì vào cuối tuần và có thể thay đổi cột thành không thể rỗng. Tôi không chắc liệu nó có giúp ích gì không, nhưng để thử và lấy dữ liệu bảng vào nhóm bộ đệm, ngay trước khi tạo cột không thể rỗng, tôi đã chạy SELECT c1, count(*) FROM t1 GROUP BY c1mất khoảng 9 phút để chạy. Các ALTER TABLE ALTER COLUMNtuyên bố thực tế sau đó mất 25 phút để hoàn thành. Không tệ lắm.
Ben Amada

11

Nếu bạn đang ở Phiên bản doanh nghiệp (EE), một chiến lược tốt hơn có thể đã được thêm vào như NOT NULLmặc định 0hoặc 1(tùy theo trường hợp nào là phổ biến nhất).

Đây là một thay đổi chỉ siêu dữ liệu trong EE . Sau đó cập nhật những cái cần được lật. Điều này có nghĩa là ít cập nhật hơn và không cần thay đổi tính vô hiệu của cột khi kết thúc. - martin-smith


Thật thú vị tôi đã nhận thấy tính năng này vào tuần trước khi tôi thử nghiệm thêm một cột bit không có giá trị với giá trị mặc định cho cùng một bảng lớn này trên máy cục bộ của tôi đang chạy phiên bản dành cho nhà phát triển SQL - cột được thêm ngay lập tức và tôi không thể hiểu tại sao . Sau đó, với tôi rằng đó phải là vì phiên bản dành cho nhà phát triển bao gồm các tính năng EE.
Ben Amada

-3

Hãy thử sao chép dữ liệu vào một bảng mới, sau đó đổi tên nó. Bạn phải quan tâm đến bất kỳ ràng buộc và chỉ mục. Đó là những gì người thiết kế bảng SSMS đang làm khi bạn muốn sắp xếp lại các cột (ví dụ), nhưng bạn nên kiểm tra tập lệnh để xem liệu có bất cứ điều gì không đúng.

Trong quá trình sao chép, quyền truy cập đọc vào bảng nguồn không phải là vấn đề, nhưng nếu có bất kỳ ghi nào thì chúng có thể bị chặn hoặc không được sao chép, tùy thuộc vào mức độ cô lập.

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.