簡體   English   中英

Sys.dm_db_missing_index_details和顧問

[英]Sys.dm_db_missing_index_details and Advisor

我運行此查詢

SELECT * FROM [dbo].[Bets] 
WHERE [BetAmount] =1000

然后我檢查

SELECT * FROM sys.dm_db_missing_index_details

最后一個的結果是 在此處輸入圖片說明

然后我使用了Tuning Advisor並獲得以下結果,它建議我創建以下索引-

開啟ANSI_PADDING

CREATE NONCLUSTERED INDEX [_dta_index_Bets_5_277576027__K4_1_2_3_5_6] ON [dbo].[Bets]
(
    [BetAmount] ASC
)
INCLUDE (   [BetID],
    [PlayerID],
    [GameID],
    [BetDate],
    [BetResults]) WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]

我的問題是顧問程序和sys.dm是否應生成相同的結果?

就我個人而言,我會接受DMV或Tuning Advisor“建議”的任何建議。 索引調優是一種藝術形式,這兩個工具都還沒有完全正確。 與簡單地添加針對一個查詢的索引相比,查看到目前為止擁有的索引並添加/調整它們以定位更廣泛的查詢要好得多。

反正我離題了

所以下面的查詢:

SELECT * FROM [dbo].[Bets] 
WHERE [BetAmount] = 1000;

....給出建議的索引:

CREATE NONCLUSTERED INDEX IX_Bets_BetAmount
ON dbo.Bets(BetAmount);
GO

根據該一個查詢( 和一個查詢 ),SQL Server已確定通過在索引中包含任何列而獲得的任何好處都是微不足道的,因為返回的行數可能很少,並且對聚簇索引幾乎與“索引搜索”一樣高效。

現有表上的統計信息可以確定對賭注金額1000的查詢將返回很少的行數。

但是,您可以很容易地運行另一個查詢,該查詢返回更多行(例如10條):

SELECT * FROM [dbo].[Bets] 
WHERE [BetAmount] = 10;

... SQL Server現在可能會看到在索引中包含額外列的好處。

CREATE NONCLUSTERED INDEX IX_Bets_BetAmount 
ON [dbo].[Bets]([BetAmount] ASC)
INCLUDE ([BetID], [PlayerID], [GameID], [BetDate], [BetResults]);
GO

DMV和Tuning Advisor之間的區別在於,Tuning Advisor可以全面查看數據庫上的活動,而不是一次性查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM