假設我有這樣一張桌子。 Id是主鍵,所以我知道我得到了一個索引。表的主鍵是該表的另一個索引中的列嗎?
CREATE TABLE Employer
(
Id VARCHAR(64) NOT NULL,
EntityId VARCHAR(64) NOT NULL,
Name VARCHAR(64) NOT NULL,
Address1 VARCHAR(64) NOT NULL,
Address2 VARCHAR(64) NOT NULL,
City VARCHAR(64) NOT NULL,
JobTitle VARCHAR(64) NOT NULL,
StateCode VARCHAR(64) NOT NULL,
ZipCode VARCHAR(64) NOT NULL,
CONSTRAINT PK_Employer_Id PRIMARY KEY CLUSTERED (Id ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
比方說,我添加了另一個索引來幫助一些特殊的搜索(雖然之所以沒有真正相關的原因)。是否有理由將Id(主鍵)包含爲索引中的一列?我有SQL專家告訴我這是浪費空間,因爲索引將以某種方式包含主鍵。
CREATE INDEX [idxEmployerByNameAddress1City] on [Employer] ([EntityId], [Id], [Name], [Address1], [City])
**請使用** - 請勿將'VARCHAR(64)'作爲聚簇索引!這對性能來說真的是非常糟糕...... SQL Server表上的聚簇索引應該很小(4-8字節)和固定寬度(不是可變寬度,比如'VARCHAR(64)') - INT IDENTITY'幾乎完美。閱讀[Kimberly Tripp的不斷增長的集羣密鑰 - 聚集索引辯論.........。關鍵!](http://www.sqlskills.com/blogs/kimberly/ever-increasing-clustering-key-the-clustered-index-辯論 - 再次/)博客文章和她在聚集索引上發佈的任何內容 - 她是* SQL Server索引*的女王* - 遵循她的建議! –
您的羣集密鑰(默認情況下是主鍵)將自動成爲每個非聚集索引的一部分 - 這也是集羣密鑰應該很小且性能良好的另一個原因!但是,單獨添加'ID'不是浪費空間 - 無論如何它都包含在該索引中,如果您明確指定它,SQL Serve將不會複製它 - >沒有空間被浪費。 –
我同意VARCHAR(64)的東西。對於我們的應用來說,這是一個遺留問題,實際上它有一個半好的理由。所以現在很難改變。但在我們的應用程序的下一個版本中,我們計劃切換到大型整數或指導。 –