[英]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.