我有一個包含複合主鍵的表。它創建聚集索引。如果我在WHERE
子句中使用該複合主鍵中的幾列,該索引是否仍然有效?或者我必須根據WHERE
中使用的列創建新索引?任何幫助,將不勝感激。SQL Server 2008中的羣集索引
1
A
回答
2
任何索引(無論是否爲聚簇)只對查詢有用,只要它的定義中最左邊的列都是WHERE子句的一部分即可。
如果您有(Col1,Col2,Col3)
索引,那麼這個指數可以爲所有使用3列,或Col2
和Col1
,或者只是Col1
WHERE子句有用。但只要Col1
不是包含在搜索中,索引就沒用了。
1
如果有可能,我儘量避免組合鍵 - 特別是主鍵。另外:如果您有複合鍵,則只有在使用最左邊的n列時纔有效。如果您的組合鍵中的第三個位置有一列,並且您的搜索僅在該第三列上有WHERE
,則索引將無法使用。
聚類鍵理想情況下是一個小的,穩定的,唯一且不斷增長的列 - INT或BIGINT作爲默認選項。不要超載您的羣集密鑰!不要過於寬泛,並且儘量避免使用不同大小的列(如VARCHAR
- 它們會帶來額外開銷)
還有一個問題需要考慮:表中的集羣鍵將被添加到每個列以及桌面上每個非聚集索引中的每個條目 - 因此您確實希望確保它儘可能小。通常情況下,具有超過250億行的INT應該足以滿足絕大多數表的要求 - 並且與GUID作爲集羣密鑰相比,您可以爲磁盤和服務器內存節省數百兆的存儲空間。
還有一些值得思考的東西 - 金伯利特里普的優秀作品 - 讀它,再讀一遍,消化它!這真是SQL Server索引福音書。
相關問題
- 1. 集羣索引SQL Server
- 2. SQL Server中的羣集索引
- 3. SQL Server非集羣索引 - 包含值
- 4. SQL Server - 分區表與集羣索引?
- 5. SQL Server 2008非聚集索引
- 6. 集羣索引
- 7. SQL Server - 何時使用羣集與非羣集索引?
- 8. SQL Server:將羣集主索引更改爲非羣集
- 9. 使用SQL Server 2008的集羣環境
- 10. 羣集共享捲上的SQL Server 2008故障轉移羣集?
- 11. 羣集索引和非聚簇索引 - SQL Server和Oracle?
- 12. SQL Server 2008 R2長期遠程集羣
- 13. SQL Server中主鍵(集羣)和集羣唯一索引之間的區別
- 14. 列索引在SQL Server 2008
- 15. SQL Server 2008:NULL索引值
- 16. SQL Server 2008篩選索引
- 17. SQL Server 2008中的索引視圖
- 18. SQL Server 2008中的篩選索引
- 19. SQL Server集羣
- 20. 標準版SQL Server中的羣集ColumnStore索引
- 21. 將集羣索引應用到SQL Server 2012中的視圖
- 22. 升級SQL Server 2008 R2故障轉移羣集到SQL Server 2012
- 23. SQL索引問題:爲什麼SQL Server更喜歡這個非集羣索引到一個集羣?
- 24. SQL Server 2008中 - 過濾索引
- 25. Sql Server執行計劃,非集羣索引掃描的開銷
- 26. SQL Server聚集索引 - 索引問題
- 27. sql server 2008無效的列索引0
- 28. SQL Server 2008上的全文索引
- 29. SQL Server 2008 R2上的索引視圖
- 30. SQL Server 2008的全文索引問題
這可能是一個COL1,COL3搜索,但情況因人而異有用。我想添加那麼WHERE子句順序無關緊要,所以col1,col2與col2相同,col1 * only *在WHERE子句中儘管... +1也是 – gbn 2011-05-19 14:29:48
非常感謝您的所有答案。很好的幫助。順便說一句,YMMV是什麼? – 2011-05-19 15:08:59
@gmail用戶 - 您的里程可能會有所不同 - 這是一種表明您提供的建議在您的特定情況/環境中可能正確也可能不正確的方式,因此建議您在依賴真實數據/查詢之前對其進行測試就像是真實的。 – 2011-05-19 15:48:33