选择中使用哪个索引?为什么?

时间:2010-05-27 08:29:50

标签: sql-server select indexing

我的表格带有以下列的邮政编码:

id - PRIMARY KEY
code - NONCLUSTERED INDEX
city

执行查询时

SELECT TOP 10 * FROM ZIPCodes

我得到的结果按id列排序。但是当我将查询更改为:

SELECT TOP 10 id FROM ZIPCodes

我得到的结果按code列排序。再次,当我将查询更改为:

SELECT TOP 10 code FROM ZIPCodes

我再次按code列排序结果。最后当我改为:

SELECT TOP 10 id,code FROM ZIPCodes

我得到的结果按id列排序。

我的问题在于问题的标题。我知道查询中使用了哪些索引,但我的问题是,为什么使用这些索引?我的第二个查询(SELECT TOP 10 id FROM ZIPCodes)如果使用了clusteder索引会不会更快?查询引擎如何选择使用哪个索引?

3 个答案:

答案 0 :(得分:3)

由于您没有要求提供特定的数据集,因此没有“最佳”方式来选择返回哪些行。提示:没有ORDER BY的TOP是荒谬的。

我假设仅索引数据可以满足的查询使用该索引,而“按id排序”的数据根本不使用索引。您的元组恰好按特定顺序存储,因为表是按ID聚类的。

答案 1 :(得分:2)

查询引擎正在使用Id索引,因为执行查询所需要知道的只是该列中的前10个值。如果要使用聚簇索引,则必须读取该行的所有值以获得所需的值。

为了强调这一点,假设城市列是VARCHAR(4000)列。如果它使用了聚簇索引,则必须读取它处理的每一行的city列。通过使用非clusted Code索引,它只需读取它将返回的字节。

答案 2 :(得分:1)

如果您的索引具有代码作为第一个/唯一列,虽然它不是表中的第一列,但扫描索引可能比扫描表更快,因为您只是选择一列。您需要查看执行计划以获得更多细节。