聚集索引突然被禁用
我有一個大小為 40 GB 的大型數據庫和一個主表,其中一個主表的行數為 3763071 行,名稱為“XXX”,並且該表有一個作為主鍵的聚集索引
突然,聚集索引被禁用並且查詢停止
我在那個表上有一個巨大的並發訪問 我有一個全文索引在同一個表上也被禁用了 ,當我打開日誌時發現 sql 在那個問題之前得到了一些更新。我正在使用 dot net framework 4.5 和 entity framework as
ORM
andsql 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 來查看索引的活躍程度。這是一個好的開始。