我的表格带有以下列的邮政编码:
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索引会不会更快?查询引擎如何选择使用哪个索引?
答案 0 :(得分:3)
由于您没有要求提供特定的数据集,因此没有“最佳”方式来选择返回哪些行。提示:没有ORDER BY的TOP是荒谬的。
我假设仅索引数据可以满足的查询使用该索引,而“按id排序”的数据根本不使用索引。您的元组恰好按特定顺序存储,因为表是按ID聚类的。
答案 1 :(得分:2)
查询引擎正在使用Id索引,因为执行查询所需要知道的只是该列中的前10个值。如果要使用聚簇索引,则必须读取该行的所有值以获得所需的值。
为了强调这一点,假设城市列是VARCHAR(4000)列。如果它使用了聚簇索引,则必须读取它处理的每一行的city列。通过使用非clusted Code索引,它只需读取它将返回的字节。
答案 2 :(得分:1)
如果您的索引具有代码作为第一个/唯一列,虽然它不是表中的第一列,但扫描索引可能比扫描表更快,因为您只是选择一列。您需要查看执行计划以获得更多细节。