Bài viết này thảo luận về một sự cố xảy ra trong một truy vấn của một chỉ mục liên cụm liên kết trong Microsoft SQL Server 2014. Bài viết này cung cấp một giải pháp cho sự cố này.

Tóm tắt

Khi bạn sử dụng một truy vấn để quét một chỉ mục columnstore liên cụm trong Microsoft SQL Server 2014, bạn có thể, bên dưới các điều kiện hiếm, nhận được kết quả truy vấn một phần. Sự cố này xảy ra khi thao tác sau đang chạy.

Bước 1

Câu lệnh Transact-SQL [chèn hoặc hàng loạt-INSERT] chèn dữ liệu vào bảng có chỉ mục columnstore liên cụm. Trong quá trình hoạt động này, các điều kiện sau đây được áp dụng:

  • Khi câu lệnh Transact-SQL đạt đến ngưỡng rowgroup, nó sẽ đóng nhóm bộ R1 rowgroup có phân đoạn S1.

  • Phân đoạn S1 trỏ tới từ điển địa phương.

  • Câu lệnh tiếp tục chèn hàng thành mới rowgroup R2.

  • Khi kết thúc bộ R1 nhóm, từ điển địa phương cũng không phải đóng. Nếu Dictionary D1 vẫn có sẵn khoảng trống, bạn có thể để nó mở và tái sử dụng nó cho rowgroup mới.

Bước 2

Nếu câu lệnh Transact-SQL đã kết thúc không thường xuyên hoặc hủy bỏ trước khi nó đóng nhóm rowgroup mới, thì các điều kiện sau đây sẽ áp dụng:

  • Các thay đổi siêu dữ liệu columnstore xảy ra trong các giao dịch phụ liên quan đến một cách độc lập với giao dịch bên ngoài.

  • Lúc này, rowgroup R1 vẫn tồn tại trong bảng hệ thống trong một "bên dưới xây dựng" hoặc trạng thái ẩn và phân đoạn S1 tham chiếu từ điển D1.

  • Không có hàng nào được tạo trong bảng hệ thống cho từ điển D1. Điều này là do câu lệnh Transact-SQL không bao giờ có cơ hội đóng hàng hiện có. Do đó, hàng hiện có vẫn tồn tại.

Bước 3

Trong một tình huống điển hình, nếu nhiệm vụ của nền phản hồi bộ bắt đầu sau khi kết thúc Transact-SQL chấm dứt, nhiệm vụ nền sẽ loại bỏ bộ R1 và các phân đoạn không nhìn thấy được. Nếu một câu lệnh mới của Transact-SQL bắt đầu và tạo ra các thiết bị thông báo có phân đoạn mới của một S3, yêu cầu một từ điển địa phương mới, bạn không thể sử dụng lại ID nội bộ của từ điển D1. Điều này là do trạng thái trong bộ nhớ của columnstore sẽ theo dõi các ID từ điển được dùng. Do đó, phân đoạn S3 sẽ tham chiếu từ điển mới D2.Lưu ý Điều kiện trong bước này là một điều kiện phổ biến. Do đó, không tham nhũng nào xảy ra.

Bước 4

Nếu SQL Server sẽ mất trạng thái trong bộ nhớ của từ điển D1 trước khi nhiệm vụ Mover bộ có hiệu lực (và thực hiện như mô tả trong bước 3), vấn đề được mô tả trong bài viết này xảy ra.Lưu ý́

  • Sự kiện này xảy ra vì bất kỳ lý do nào sau đây:

    • SQL Server trải nghiệm quá tải bộ nhớ và nội dung trong bộ nhớ của từ điển D1 bị gỡ bỏ khỏi bộ nhớ.

    • Phiên bản SQL Server được khởi động lại.

    • Cơ sở dữ liệu có chỉ mục liên cụm cột đi kèm ngoại tuyến và sau đó quay lại trực tuyến.

  • Sau khi một trong những sự kiện này xảy ra và SQL Server tải lại cấu trúc trong bộ nhớ, không có bản ghi nào đó là một từ điển D1 và ID nội bộ của nó tồn tại. Điều này là do từ điển D1 không được giữ lại trong các bảng hệ thống khi kết thúc Transact-SQL đã được chấm dứt hoặc conceled.

  • Nếu tác vụ nền Mover bộ bắt đầu tại thời điểm này, không có lỗi xảy ra vì các điều kiện được mô tả trong bước 3 được áp dụng.

  • Nếu một nhóm rowgroup mới sẽ được tạo trước khi tác vụ nền động lực bắt đầu (cho mỗi mục dấu đầu dòng trước đó), SQL Server sẽ gán cùng một ID nội bộ cho từ điển mới, và nó tham chiếu từ điển D1 cho phân đoạn S3 trong rowgroup R3.

  • Khi tác vụ nền Mover bộ bắt đầu sau hành động trước đó, nó giảm R1 rowgroup ẩn và các mảng phân đoạn S1 cùng với từ điển mới D1. Điều này xảy ra vì Mover bộ xem xét rằng từ điển mới D1 và từ điển gốc D1 rằng các tham chiếu S1 đều giống nhau.Lưu ý Khi điều kiện này xảy ra, bạn không thể truy vấn Nội dung của rowgroup R3.

Giải pháp

Vấn đề lần đầu tiên được khắc phục trong các bản Cập Nhật tích lũy sau đây cho SQL Server:

Bản Cập Nhật tích lũy 1 cho SQL server 2014 SP1 Cumulative Update 8 cho SQL Server 2014Bản sửa lỗi cho sự cố này cũng được đưa vào các bản Cập Nhật phân phối chung sau đây (GDR):

Bản Cập Nhật bảo mật cho SQL Server 2014 QFE  Bản cập nhật này bao gồm Cập Nhật tích lũy 8, bản sửa lỗi quan trọng này và các bản Cập Nhật bảo mật bắt buộc MS15-058.Bản Cập Nhật bảo mật cho SQL Server 2014 GDR  Bản cập nhật này bao gồm bản sửa lỗi bảo mật và khắc phục sự cố quan trọng này thông qua MS15-058.Bản Cập Nhật không bảo mật cho SQL Server 2014 gói dịch vụ 1 GDR  Bản cập nhật này chỉ bao gồm bản sửa lỗi quan trọng này.

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 đó. Xem các bản Cập Nhật tích lũy mới nhất cho SQL Server:

Thông tin Bổ sung

Thông báo lỗiTrong một cơ sở dữ liệu hiện đang bị ảnh hưởng, nếu bạn chạy DBCC CHECKDB sau khi bạn áp dụng bản sửa lỗi này, bạn sẽ nhận được thông báo lỗi sau đây:

Msg 5289, mức 16, trạng thái 1, dòng 1 danh mục liên cụm từ ' CCI ' trên Table ' ' có một hoặc nhiều giá trị dữ liệu không khớp với giá trị dữ liệu trong từ điển. Khôi phục dữ liệu từ bản sao lưu.

Trong một cơ sở dữ liệu hiện đang bị ảnh hưởng, khi bạn chạy một truy vấn quét các bảng bị ảnh hưởng sau khi bạn áp dụng bản sửa lỗi này, bạn nhận được thông báo lỗi sau đây:

Msg 5288, mức 16, trạng thái 1, dòng 1 Columnstore index có một hoặc nhiều giá trị dữ liệu không khớp với giá trị dữ liệu trong từ điển. Vui lòng chạy DBCC CHECKDB để biết thêm thông tin.

Nếu bạn nhận được các lỗi này, bạn có thể lưu dữ liệu không bị hỏng bằng số lượng lớn xuất dữ liệu không ảnh hưởng đến các cột/rowgroups và sau đó tải lại dữ liệu sau khi bạn thả hoặc tạo chỉ mục cột liên cụm. Bạn nên bật theo dõi cờ 10207 để ngăn chặn lỗi 5288 và trở về hành vi cũ của việc bỏ qua rowgroups bị hỏng. Lưu ý Thông báo lỗi 5288 và 5289 được tạo ra cho nhóm này, R3 có phân đoạn S3. Theo dõi cờ 10207 được dùng để trích các phân đoạn của đường R3 nhóm không bị ảnh hưởng bởi từ điển bị thiếu D1.

Truy vấn cho cơ sở dữ liệu bị ảnh hưởngĐể xác định liệu cơ sở dữ liệu có chứa chỉ mục columnstore đã bị ảnh hưởng bởi sự cố này hay không, hãy chạy truy vấn sau đây:

select         object_name(i.object_id) as table_name,        i.name as index_name,        p.partition_number,        count(distinct s.segment_id) as damaged_rowgroups from        sys.indexes i        join sys.partitions p on p.object_id = i.object_id and p.index_id = i.index_id        join sys.column_store_row_groups g on g.object_id = i.object_id and g.index_id = i.index_id and g.partition_number = p.partition_number        join sys.column_store_segments s on s.partition_id = p.partition_id and s.segment_id = g.row_group_id where         i.type in (5, 6)        and s.secondary_dictionary_id <> -1         and g.state_description = 'COMPRESSED'        and s.secondary_dictionary_id not in        (               select dictionary_id from sys.column_store_dictionaries d               where d.hobt_id = p.hobt_id and d.column_id = s.column_id        ) group by         object_name(i.object_id),        i.name,        p.partition_number 

Lưu ý́

  • Bạn phải chạy truy vấn này đối với mọi cơ sở dữ liệu có chứa chỉ mục columnstore trên máy chủ đang chạy SQL Server. Tập kết quả trống cho biết cơ sở dữ liệu không bị ảnh hưởng.

  • Thực hiện truy vấn này trong một giai đoạn khi không có hoạt động nào sẽ tạo ra các nhóm mới hoặc thay đổi trạng thái của các rowgroups hiện có. Ví dụ, các hoạt động sau đây có thể sửa đổi trạng thái của rowgroups: lập chỉ mục xây dựng, lập lại chỉ mục lại, chèn hàng loạt, Mover sạpáp dụng các cửa hàng Delta. Trước khi bạn thực hiện truy vấn, bạn có thể tắt tác vụ Mover bộ bằng cách sử dụng dấu theo dõi gắn cờ 634. Sử dụng lệnh này để tắt tác vụ nền: DBCC TRACEON (634,-1). Sau khi truy vấn hoàn tất việc thực hiện, hãy nhớ kích hoạt lại tác vụ nền bằng cách dùng lệnh: DBCC TRACEOFF (634,-1). Ngoài ra, hãy đảm bảo không có lệnh chèn/BCP/chọn-INTO chèn dữ liệu vào các bảng sử dụng chỉ mục columnstore trong khi truy vấn này đang chạy. Chúng tôi khuyên bạn nên sử dụng các bước sau để ngăn truy vấn trả về dương tính false.

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".

Bạn cần thêm trợ giúp?

Phát triển các kỹ năng của bạn
Khám phá nội dung đào tạo
Sở hữu tính năng mới đầu tiên
Tham gia Microsoft dùng nội bộ

Thông tin này có hữu ích không?

Bạn hài lòng đến đâu với chất lượng dịch thuật?
Điều gì ảnh hưởng đến trải nghiệm của bạn?

Cảm ơn phản hồi của bạn!

×