Sql-Server-2014

聚集索引突然被禁用

  • May 13, 2020

我有一個大小為 40 GB 的大型數據庫和一個主表,其中一個主表的行數為 3763071 行,名稱為“XXX”,並且該表有一個作為主鍵的聚集索引

突然,聚集索引被禁用並且查詢停止

我在那個表上有一個巨大的並發訪問 我有一個全文索引在同一個表上也被禁用了 ,當我打開日誌時發現 sql 在那個問題之前得到了一些更新。我正在使用 dot net framework 4.5 和 entity framework as ORMand sql server 2014.so 我在問什麼可能導致該問題再次避免它?還有一個問題,我在該表上的問題不止25 index於此,那麼擁有具有重複列的索引數量是壞還是好?

聚集索引突然被禁用

您必須重建它才能訪問基表

那麼表中的數據仍然存在,但除了 Drop 或 REBUILD 操作外,其他任何操作都無法訪問。所有相關的非聚集索引和視圖都將不可用,並且引用該表的外鍵將被禁用,並且通過引導所有引用該表的查詢的失敗。

如果您的預設跟踪沒有翻轉,您可以從預設跟踪跟踪誰禁用了索引

DECLARE @filename NVARCHAR(4000);

SELECT @filename = REVERSE(SUBSTRING(REVERSE([path]), 
    CHARINDEX('\', REVERSE([path])), 260)) + N'log.trc'
  FROM sys.traces WHERE is_default = 1;

SELECT TextData, LoginName, StartTime, DatabaseID, ObjectID, IndexID
  FROM sys.fn_trace_gettable(@filename, DEFAULT)
  WHERE EventClass = 164
  AND DatabaseID > 4
  AND ObjectID IS NOT NULL
  AND IndexID IS NOT NULL
  ORDER BY StartTime DESC;

要獲得更強大的解決方案,您需要創建一個伺服器級觸發器,如 Aaron 在他的部落格文章中所述

還有一個問題,我在該表上有超過 25 個索引,那麼擁有那麼多具有重複列的索引是壞還是好?

索引有維護成本。我強烈建議使用sp_BlitzIndex(來自 Brent Ozar 的團隊)來更好地了解您目前的指數投資組合。

我敢肯定,到目前為止,您已經重建了聚群索引和 25 個非聚群索引。雖然可能很難確定您的集群索引首先被禁用的原因,但您可以嘗試實現一個或多個伺服器 DDL 觸發器,這些觸發器將在 ALTER INDEX 命令後觸發並詢問命令是否包含“禁用”一詞並滾動事務返回 - (並等待某人或某個程序抱怨該操作)。

這裡的例子:

--DDL trigger to prevent index disable
USE [master]
GO
alter TRIGGER [xx_TestDisable] 
ON ALL SERVER 
FOR ALTER_INDEX as

declare @text nvarchar(max)

SET @text = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') 

if @text like '%disable%'
   rollback
GO

ENABLE TRIGGER [xx_TestDisable] ON ALL SERVER
GO

--Testing to see if the DDL trigger rolls back a disable
CREATE TABLE T (X INT CONSTRAINT IX_Index PRIMARY KEY);

ALTER INDEX IX_Index ON T DISABLE;

SELECT *
FROM T 

至於你的 25 個索引,我想我會藉用阿爾伯特愛因斯坦的一句話(意譯)——“一切都應該盡可能簡單,但不能簡單。

如果您“需要”25 個索引,那麼您“需要”25 個索引。

只有您可以決定應該創建和維護哪些索引,但您絕對應該使用 sys.dm_db_index_usage_stats 來查看索引的活躍程度。這是一個好的開始

引用自:https://dba.stackexchange.com/questions/150035