0

我运行这个查询

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

然后我检查

SELECT * FROM sys.dm_db_missing_index_details

最后一个的结果是 在此处输入图像描述

然后我使用Tuning Advisorand 并得到以下结果,它建议我创建以下索引-

设置 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生成相同的结果吗?

4

1 回答 1

1

就我个人而言,无论是DMVTuning Advisor 还是 Tuning Advisor 的任何“建议”,我都会持保留态度。索引调优是一种艺术形式,这两种工具都还没有完全正确。与简单地添加索引以针对一个查询相比,您最好查看到目前为止拥有的索引并添加/调整它们以针对更广泛的查询。

无论如何...我离题了...

所以下面的查询:

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

....给出建议的索引:

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

基于该查询(并且仅该查询),SQL Server 已确定通过在索引中包含任何列所获得的任何好处都可以忽略不计,因为返回的行数可能很少,并且在Clustered Index 几乎与 Index Seek 一样有效。

现有表的统计信息可以确定,对 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对数据库上的活动进行全面检查,而不是一次性查询。

于 2015-05-01T08:59:13.520 回答