症狀
當您針對 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 的最新累積更新:
- 適用於 SQL Server 2014 的最新累積更新
- 適用於 SQL Server 2012 的最新累積更新
- 適用於 SQL Server 2012 SP1 的最新累積更新
- 適用於 SQL Server 2008 R2 SP2 的最新累積更新
- SQL Server 2008 SP3 的最新累積更新
狀態
Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。