2012-09-27 76 views
1

我正在創建一個用於數據處理的查找表。結構相當簡單。正常的SQL Server索引是否包含主鍵值?

第一個字段將是主鍵和聚集索引。將會有第二個字段將跟蹤項目類型。

我們希望在第二個字段的索引,因爲一些(但不是所有的查詢)將在該字段上搜索。這些查詢還需要提取主鍵的值。

我希望利用非聚集索引的查詢不必去表並獲取主鍵值。

所以我的問題是做普通的SQL Server索引有他們的主鍵值,或者他們只是有一個指向聚集索引的指針(爲我的目的,我只是假設主鍵和聚集索引是共同擴展的)?如果它只包含一個指向磁盤的指針而不是主鍵值,那麼我正考慮使第一列(主鍵)成爲基於第二列的正常索引的包含列。

+0

我不希望在索引中沒有定義的字段出現在它,它是否羣集/主鍵或其它方式。如果您希望非聚集索引覆蓋主鍵列,請明確添加它。 – Oded

+0

不是*主鍵值* - 而是**集羣鍵**。現在,默認情況下,主鍵*是集羣鍵 - 但不一定是這樣。 –

+0

謝謝你們。爲了這個問題的目的,它們是一樣的。看起來答案是肯定的,它的值在常規的非聚集索引上,所以我不需要包含列。 – geoffrobinson

回答

3

他們不一定有他們的PK列,但聚集索引的關鍵列。它們確實用作指向CI行的指針,但也可用於其他類型的查詢。

例如,列A上的索引(而不是顯式地在ID上)可以滿足查詢select A, ID from T

6

引述文檔爲CREATE INDEX

非聚集索引始終包含如果一個聚集索引表上定義聚集索引列。

1

索引的關鍵值確定了數據的順序。數據與索引一起存儲,以便數據本身是有序的。使用聚簇索引時,非聚簇索引上的指針由定義聚簇索引的值組成。否則,如果表(堆)中沒有索引,則使用掃描,其中使用行標識符作爲指針來搜索數據。

來源:SQL Server 2008中的查詢性能優化蒸餾