2010-05-27 42 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

如果您的索引有代碼作爲第一列/唯一列,但它不是表中的第一列,則掃描索引可能比掃描表的速度快,因爲您只選擇一列。你必須仔細查看執行計劃。