2015-05-01 24 views
0

我運行此查詢Sys.dm_db_missing_index_details和顧問

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

之後,我檢查

SELECT * FROM sys.dm_db_missing_index_details 

結果從最後一個是 enter image description here

然後我用的Tuning Advisor和並得到以下結果,建議我創建以下索引 -

SET ANSI_PADDING ON

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產生同樣的結果?

+1

你錯過了一半你的問題。圖像在哪裏?你也不應該爲任何查詢運行'SELECT *' –

+1

INCLUDE語句是因爲你使用'SELECT *'而添加的。沒有'INCLUDE'語句的索引對於您試圖運行的查詢看起來是合理的,儘管您可能想給它一個更好的名稱,例如IX_Bets_BetAmount。 – Jaco

回答

1

就我個人而言,我會採取任何或者DMV或調音顧問的'建議'一撮鹽。索引調整是一種藝術形式,這兩種工具都沒有完全正確。到目前爲止,您可以更好地查看目前有哪些索引,並添加/調整它們以針對更廣泛的查詢,而不僅僅是添加索引來定位一個查詢。

反正...我離題...

所以下面的查詢:

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

....給出了建議指標:

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

基於一個查詢(和單獨一個查詢),SQL Server已經確定通過在索引中包含任何列可以獲得的好處可以忽略不計,因爲numbe返回的行數可能很少,並且聚集索引上的密鑰查找功能幾乎與索引搜索功能一樣有效。

現有表格上的統計信息可以確定對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和優化顧問之間的不同之處在於優化顧問需要一個整體看看你的數據庫上的活動,而不是一次性的查詢。