Triệu chứng
Giả định rằng bạn thêm cột vào bảng trong Microsoft SQL Server 2012 hoặc SQL Server 2014. Khi kích cỡ của hàng gần như kích cỡ được phép tối đa vốn là 8.060 byte, thì thao tác thêm có thể mất nhiều thời gian.
Nguyên nhân
Sự cố xảy ra vì, khi Tổng kích cỡ của hàng gần như được phép đến với kích thước hàng tối đa, SQL Server sẽ thực hiện một bản quét đầy đủ của bảng để đảm bảo rằng việc thêm một cột mới không vi phạm tính toàn vẹn dữ liệu. Các phiên bản trước SQL Server 2012 không thực hiện kiểm tra này và làm cho ngôn ngữ định nghĩa dữ liệu (DDL) chạy nhanh hơn. Tuy nhiên, kết quả hành vi này trong trường hợp các hoạt động tiếp theo như cập nhật hàng hoặc thu nhỏ nếu kích cỡ hàng vượt quá kích cỡ được phép.
Giải pháp
Bản Cập Nhật tích lũy giới thiệu 647 dấu hiệu mới cho hành vi tương thích ngược. Vấn đề lần đầu tiên được khắc phục trong bản Cập Nhật tích lũy SQL Server sau đây.
Bản Cập Nhật tích lũy 5 cho SQL Server 2014 /en-us/help/3011055
Bản Cập Nhật tích lũy 12 cho SQL Server 2012 SP1 /en-us/help/2991533
Bản Cập Nhật tích lũy 2 cho SQL Server 2012 SP2 /en-us/help/2983175
Mỗi bản Cập Nhật tích lũy mới cho SQL Server chứa tất cả các hotfix và tất cả các bản sửa lỗi bảo mật đã được đưa vào bản Cập Nhật tích lũy trước đó. Kiểm tra các bản Cập Nhật tích lũy mới nhất cho SQL Server:
Thông tin Bổ sung
-
Bạn có thể bật cờ theo dõi 647 bằng cách sử dụng tham số khởi động. Để biết thông tin, hãy xem tùy chọn khởi động công cụ cơ sở dữ liệu.
-
Bạn có thể chạy truy vấn sau đây (vui lòng thay thế tên bảng <> với tên bảng thực tế của bạn) để kiểm tra bảng cụ thể trước khi thao tác trên hệ thống sản xuất và lập kế hoạch hiệu ứng của vấn đề này. Nếu kết quả lớn hơn 8.060, bảng của bạn phải tuân theo sự cố này. Ngoài ra, nếu bạn đã bỏ cột, bạn phải thay đổi bảng bằng tùy chọn dựng lại. Việc xây dựng lại bảng có thể giúp kết quả trả về truy vấn chính xác.
select 1+1+2 + 2 + (case when sum (case when leaf_offset < 0 then 1 else 0 end) > 0 then 2 else 0 end) + ( (count (*) + 7)/8 ) + count (case when leaf_offset < 0 then 1 else null end) * 2 + sum( case when max_length=-1 then 24 else max_length end) from sys.system_internals_partition_columns col join sys.partitions par on col.partition_id = par.partition_id where object_id = object_id ('<table name>') and index_id in (0,1) and partition_number =1
-
Bạn có thể cân nhắc thêm các cột có độ dài thay đổi hoặc các cột thưa thớt khi ứng dụng của bạn thường xuyên thêm các cột mới vào bảng. Đây là một hoạt động chỉ siêu dữ liệu ngay cả khi Tổng kích cỡ của tất cả các cột vượt quá 8.060 byte.
Trạng thái
Microsoft đã xác nhận đây là sự cố trong các sản phẩm của Microsoft được liệt kê trong phần "Áp dụng cho".