本文討論在 Microsoft SQL Server 2014 中查詢聚集列存儲索引期間發生的問題。 本文提供此問題 的解決方法

摘要

當您使用在 Microsoft SQL Server 2014 中掃描聚集列存儲索引的查詢時,您可能會在極少數情況下收到部分查詢結果。當執行下列作業時,就會發生此問題。

步驟 1

Transact-sql 語句 [插入或大容量插入] 會將資料插入具有聚集列存儲索引的資料表中。 在這個作業期間,下列條件適用:

  • 當 Transact-sql 語句達到分段閾值時,它會關閉具有區段 S1 的多重欄位 R1。

  • 區段 S1 指向 [局部字典 D1]。

  • 該語句會繼續在新的資料列 R2 中插入列。

  • 當您關閉 [地域 R1] 時,局部字典 D1 也不需要關閉。 如果字典 D1 仍有可用的空間,您可以將它保持在開啟狀態,並針對新的磁片檔 R2 重複使用它。

步驟 2

如果 Transact-sql 語句在關閉新的多重報表 R2 前,異常或取消,請遵循下列條件:

  • 資料列中繼資料變更會在 subtransactions 中進行,以獨立于外部事務進行確認。

  • 此時,在系統資料表中,陣列 R1 會保留在「正在建設中」或隱藏狀態,而區段 S1 會參照字典 D1。

  • 在系統資料表中沒有建立字典 D1 的資料列。 這是因為 Transact-sql 語句絕對沒有機會關閉現有的列。 因此,現有的列會繼續存在。

步驟3

在一般情況下,如果在 Transact-sql 語句結束之後就會啟動元組移動背景工作,背景工作會移除不可見的多重欄位 R1 以及區段 S1。 如果新的 Transact-sql 語句現在已開始,並建立一個含有新的區段 S3 (需要新的本機字典),您就無法重複使用字典 D1 的內部識別碼。 這是因為列存儲的記憶體中狀態會持續追蹤所使用的字典識別碼。 因此,區段 S3 會參照新的字典 D2。注意: 此步驟中的條件是常見的情況。 因此,不會發生任何損壞。

步驟4

如果 SQL Server 在元組移動作業生效之前遺失了字典 D1 的記憶體內狀態(並按照步驟3中所述的方式執行),本文所述的問題就會發生。注意事項

  • 此事件會因下列任何原因而發生:

    • SQL Server 遇到記憶體超載,且字典 D1 的記憶體中內容是從記憶體中逐出。

    • SQL Server 實例已重新開機。

    • 包含聚集列存儲索引的資料庫會移至離線,然後再重新連線。

  • 發生任何一個事件且 SQL Server 重新載入記憶體內部結構之後,就不會有字典 D1 及其內部 ID 存在的記錄。 這是因為當 Transact-sql 語句結束或 conceled 時,字典 D1 未保留在系統資料表中。

  • 如果 [元組移動器] 背景工作在這個時間點開始,就不會發生錯誤,因為步驟3中所述的條件為 [apply]。

  • 如果在 [元組移動器] 背景工作開始之前(依前一個專案符號專案)建立新的新組 R3,SQL Server 會將相同的內部識別碼指派給新的字典 D1,而且它會參照在組中 R3 的區段 S3 的字典 D1。

  • 當元組移動器背景工作在前一個動作之後啟動時,它會將隱藏的分段 R1 及其區段 S1 與新的字典 D1 一起刪除。 這是因為元組移動器會認為新的字典 D1,以及 S1 參照的原始字典 D1 是一樣的。注意: 發生這種情況時,您無法查詢大量的 R3 中的內容。

解決方案

此問題首先是在 SQL Server 的下列累積更新中修正:

Sql server 2014 的累積更新 1 SP1 sql server 2014 的累加更新 8此問題的修正程式也包含在下列一般發行版本本(GDR)更新中:

SQL Server 2014 QFE 的安全性更新  此更新包括累積更新8、此重要修正程式,以及所需的 MS15-058 安全性更新。SQL Server 2014 GDR 的安全性更新  此更新包含透過 MS15-058 的這個重要修正程式和累積式安全性修正程式。SQL Server 2014 Service Pack 1 GDR 的 Nonsecurity 更新  此更新只包含此重要的修正程式。

每個新的 SQL Server 累計更新都包含所有的修正程式,以及前一個累積更新中所包含的所有安全性修正程式。 請參閱 SQL Server 的最新累計更新:

其他相關資訊

錯誤訊息在目前受影響的資料庫中,如果您在套用此修正程式後執行 DBCC CHECKDB,您會收到下列錯誤訊息:

Msg 5289、Level 16、State 1、列1聚集資料行2的 "cci" 在 table [t "上有一個或多個與字典中的資料值不相符的資料值。 從備份還原資料。

在目前受影響的資料庫中,當您套用此修正程式後,當您執行掃描受影響表格的查詢時,會收到下列錯誤訊息:

Msg 5288、Level 16、State 1、Line 1 列存儲索引的一個或多個資料值與字典中的資料值不相符。 請執行 DBCC CHECKDB 以取得詳細資訊。

如果您收到這些錯誤,您可以透過大量匯出未受影響之欄/rowgroups 的資料來儲存未獲損壞的資料,然後在您除去或建立聚集列存儲索引後重新載入資料。 您應該啟用追蹤標誌10207來取消5288錯誤,並還原為略過損毀 rowgroups 的舊行為。 注意針對具有區段 S3 的這個分段 R3 產生了5288和5289的錯誤訊息。 Trace 標誌10207是用來提取超出缺少字典 D1 之範圍的範圍,這些區段不會受到影響。

查詢受影響的資料庫若要判斷包含資料列索引的資料庫是否已受此問題影響,請執行下列查詢:

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 

注意事項

  • 您必須針對在執行 SQL Server 的伺服器上包含資料列索引的每個資料庫執行此查詢。 空白的結果集表示資料庫不會受到影響。

  • 當沒有活動可建立新 rowgroups 或變更現有 rowgroups 的狀態時,請在期間執行此查詢。 例如,下列活動可以修改 rowgroups 的狀態: [索引建立]、[索引重組]、[大容量插入]、[元組集移動器] 壓縮差異存儲區。 在執行查詢前,您可以使用追蹤標誌634來停用背景元組移動作業。 使用此命令來停用背景工作: DBCC TRACEON (634、-1)。 查詢執行完畢之後,請記得使用命令: DBCC TRACEOFF (634、-1)來重新啟用背景工作。此外,請確定在執行此查詢時,沒有大量的 INSERT/BCP/SELECT-插入資料到使用列存儲索引的資料表中。建議使用這些步驟來避免查詢傳回假陽性。

狀態

Microsoft 已確認<適用於>一節所列的 Microsoft 產品確實有上述問題。

Need more help?

Expand your skills
Explore Training
Get new features first
Join Microsoft Insiders

Was this information helpful?

How satisfied are you with the translation quality?
What affected your experience?

Thank you for your feedback!

×