我需要重建SQL服务器数据库索引吗?

3

我使用了内置的性能调优工具并为我的数据库建立了索引。自那以后,我将一些查询从“select top 10...”更改为“select top 50”。

我的问题是,我需要重新构建SQL服务器数据库索引吗?


没有使用“top”命令怎么办? - Rana
2个回答

3
如果您只是将前10个更改为前50个,则无需重建索引。查询在执行计划方面完全相同(因此将受益于现有索引),唯一的区别是您从结果集中检索了一些额外的行。
如果您在更改后注意到性能大幅下降,则问题必须出在其他地方。例如,我曾经看到过添加数据后需要重建聚集索引以提高性能,但这是由于新数据而不是由于将前10个更改为前50个。
编辑:Sam Saffron指出,在前10个和前50个查询之间,执行计划可能会发生变化,请确保检查两个执行计划并查看它们是否有所不同。

如果你有很多行数据,获取所有数据的时间当然会更长,但查询时间应该是相等的。毕竟,你改变的只是要获取的数据量,而不是如何选择这些数据。 - Vinko Vrsalovic
有时当您从 top 10 切换到 top 50 时,我看到查询计划会发生根本性的变化。 - Sam Saffron
在某个点上,如果行非常宽且索引非常窄,当执行select *时,通过索引然后进行书签查找可能会变得过于昂贵。一旦达到某个特定的阈值,表扫描可能更加廉价,我曾经见过这种情况,该阈值相当低 - 低于您所预期的。 - Sam Saffron

0

虽然查询模式发生变化时不需要重建索引,但您可能需要重新考虑索引。

例如,假设您有一个在特定列上的非聚集索引的表。每当您需要提取不在非聚集索引中的数据行时,SQL 将不得不访问底层表以提取数据。

当您提取 1 行时,通常最便宜的方法是先访问非聚集索引,然后再访问主表;但是,如果您提取了大量行,则扫描整个表可能会更便宜。

底线 如果查询模式发生变化,您可能需要检查您的索引,有可能对于一个 前 10 名 查询效果很好的索引,在 前 50 名 查询中将不再被选中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接