KB2878968 - 修正:當您針對 SQL Server 中的某個資料表,搭配 NOLOCK 提示執行複雜的 UPDATE 陳述式時,可能會發生非叢集索引損毀

Applies To
SQL Server 2008 Service Pack 3 SQL Server 2008 Enterprise SQL Server 2008 Developer SQL Server 2008 Standard SQL Server 2008 R2 Datacenter SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard SQL Server 2008 R2 Web SQL Server 2008 R2 Workgroup SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2012 Web SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

症狀

當您針對 Microsoft SQL Server 2008、SQL Server 2012、SQL Server 2008 R2 或 SQL Server 2014 中的資料表執行複雜的 UPDATE 陳述式及 NOLOCK 提示時,可能會發生非叢集索引損毀。 此外,下列錯誤訊息可能會記錄在 SQL Server 錯誤記錄檔中:

注意

<日期><時間> spid # 錯誤:8646,嚴重性:21,狀態:1。
<Date><Time> spid # 無法在資料庫 '<DatabaseName>' 中,從資料表 2102402659 的索引識別碼 3 中找到索引項目。 指定的索引已損毀,或目前的更新計劃發生問題。 執行 DBCC CHECKDB 或 DBCC CHECKTABLE。 如果問題持續發生,請連絡產品支援。
<日期><時間> spid # 使用「dbghelp.dll」版本「4.0.5」
<日期><時間> spid # **傾印執行緒 - spid = 0, EC = 0x0000000BD70624C0
<Date><Time> spid # ***堆疊傾印正在傳送至 Y:\MSSQL\MSSQL10.MSSQLSERVER\MSSQL\LOG\SQLDump0003.txt
<日期><時間> spid # * *******************************************************************************
<日期><時間> spid # *
<Date><Time> spid # * BEGIN STACK DUMP:
<Date><Time> spid # * <日期><時間> spid#
<日期><時間> spid # *
<Date><Time> spid # * CPerIndexMetaQS::ErrorAbort - 索引損毀
<日期><時間> spid # *

注意:您可以將 NOLOCK 提示套用至陳述式中的來源資料表。 不過,您無法將 NOLOCK 提示套用至陳述式中的目標資料表。

原因

發生此問題的原因是當查詢多次讀取相同的值時,NOLOCK 提示導致查詢不正確地讀取資料表中的值。

解決方式

此問題已先在下列 SQL Server 累積更新中修正。

SQL Server 2014 累積更新 1 /zh-tw/help/2931693

SQL Server 2012 的累積更新 11 /zh-tw/help/2908007

SQL Server 2012 SP1 的累積更新 7 /zh-tw/help/2894115

SQL Server 2008 SP3 的累積更新 13 /zh-tw/help/2880350

SQL Server 2008 R2 SP2 的累積更新 9 /zh-tw/help/2887606

關於 SQL Server 的累積更新

SQL Server 的每個新累積更新都包含所有 Hotfix 和先前累積更新的所有安全性修正程式。 查看 SQL Server 的最新累積更新:

      

狀態

Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。