Sql-Server

需要關於 Indexaphobia 的建議:具有高影響的高價值缺失指數。當索引已經存在時

  • December 1, 2020

當我已經有索引以及如何解決它時,我試圖理解這個特定表的缺失索引的真正含義。

我有一張經常使用的桌子,大約 2.5GB。由於它被大量使用,有點猶豫要創建不是非常需要的索引(值得商榷)。該表之前是堆的,最近將主鍵從非集群更改為集群後更改為表。

當我使用數據庫名稱或此表執行 sp_blitzindex 時,結果如下:

Blitzindex 的結果

大多數情況下,它建議在 APT_ID 列上創建索引,並包括建議 LOGID、RECEIVE_TIME 和其他一些列。如果我們看表定義,主鍵定義在 LOGID 和 RECEIVE_TIME。而且我們在 APT_ID 列上有一個 NC 索引。

表 DDL 如下:

CREATE TABLE [dbo].[TXN_LOG](
   [LOGID] [int] IDENTITY(1,1) NOT NULL,
   [RECEIVE_TIME] [varchar](15) NOT NULL,
   [APT_ID] [int] NOT NULL,
   [VAR32_01] [varchar](32) NULL,
   [VAR32_02] [varchar](32) NULL,
   .
   .
   .
   [ERROR_CODE] [varchar](20) NULL,
   [MESSAGE_ID] [varchar](40) NULL,
   [END_POINT_ID] [varchar](50) NULL,
   [NODE_ID] [varchar](40) NULL,
   [TIMEOUT_NETWORK_ID] [int] NULL,
   [TXN_SUMMARY] [numeric](1, 0) NULL,
   [D_FLAG] [numeric](1, 0) NULL,
    CONSTRAINT [PKTXN_LOG] PRIMARY KEY CLUSTERED 
   (
       [LOGID] ASC,
       [RECEIVE_TIME] ASC
   ))
GO

此表上的 NC 索引為:

CREATE NONCLUSTERED INDEX [IDX_TXN_LOG_1] ON [dbo].[TXN_LOG]
(
   [APT_ID] ASC
)
INCLUDE([RECEIVE_TIME]) 
GO

目前使用的索引似乎不支持 NC 索引,因為寫入次數高於讀取次數。

索引的使用

對於在問題中附加圖像表示誠摯的歉意。感謝我能否就此獲得一些專家建議。提前致謝。

版本:Microsoft SQL Server 2014 (SP3-GDR) (KB4532095) - 12.0.6118.4 (X64) 2019 年 12 月 12 日 21:46:15 版權所有 (c) Microsoft Corporation Enterprise Edition:Windows NT 上基於核心的許可(64 位) 6.3(內部版本 9600:)(管理程序)

要清理和簡化您的問題:

  • 您已經擁有的索引在$$ LOGID $$,$$ RECEIVE_TIME $$
  • SQL Server 請求 APT_ID 上的索引,它希望您包括 LOGID、RECEIVE_TIME

這確實是一個與您已有的不同的索引。

讓我們以電話簿的舊範例為例。電話簿的白頁位於 LAST_NAME、FIRST_NAME、MIDDLE_NAME。如果您執行這樣的查詢,那就太好了:

SELECT *
FROM PHONE_BOOK
WHERE LAST_NAME = 'OZAR'

但是,如果您不知道某人的姓氏,並且您要求這樣做:

SELECT *
FROM PHONE_BOOK
WHERE FIRST_NAME = 'BRENT'

然後你會掃描整個電話簿來尋找我。索引中的第一列非常重要。這就是 SQL Server 要求 APT_ID 以及其他列的索引的原因。

所以您可能會問,“為什麼僅 APT_ID 上的現有索引還不夠?” 問題是,在您的情況下,APT_ID 的選擇性不夠,或者人們要求 APT_ID 的範圍。SQL Server 必須進行大量的鍵查找,而缺少的索引建議正試圖刪除這些。

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