2010-05-27 38 views
3

我有邮政编码的表列如下:在select中使用了哪个索引,为什么?

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列排序结果。

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

回答

3

由于您不需要特定的数据集,因此没有“最佳”方法来选择返回哪些行。提示:TOP没有ORDER BY是无意义的。

我假设只有索引数据可以满足的查询使用该索引,而'按ID排序'的数据根本不使用索引。由于表按ID进行聚类,因此您的元组恰好恰好按特定顺序存储。

2

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

为了强调一点,设想城市列是VARCHAR(4000)列。如果它使用聚集索引,那么它必须读取它处理的每一行的城市列。通过使用非集群代码索引,它只需读取它将返回的字节。

1

如果您的索引有代码作为第一列/唯一列,但它不是表中的第一列,则扫描索引可能比扫描表的速度快,因为您只选择一列。你必须仔细查看执行计划。

相关问题