Sql-Server
主鍵約束排序
主鍵約束中的欄位是否優化了表的排序?
這是表的架構:
CREATE TABLE Persons ( Field1 long NOT NULL, Field2 long NOT NULL, Field3 long NOT NULL, Field4 long NOT NULL, Filed5 long NOT NULL, CONSTRAINT PK_Person PRIMARY KEY (Field1 Asc,Field2 Asc,Field3 Asc,Field4 Asc));
排序查詢:
Select * from Persons order by Field4
in主
field4
鍵約束不提供任何關於值的唯一性。添加它的唯一原因是優化對 的排序
field4
,因為對具有聚集索引的列進行排序有助於優化。簡而言之,
field4
主鍵約束是否有助於優化上述排序查詢,即使主鍵約束是使用field
1 thenfield2
thenfield3
和field4
?
它可以幫助您查詢的某些變體。以這個設置為例:
CREATE TABLE dbo.Persons ( Field1 INTEGER NOT NULL, Field2 INTEGER NOT NULL, Field3 INTEGER NOT NULL, Field4 INTEGER NOT NULL, Field5 INTEGER NOT NULL, CONSTRAINT PK_Person PRIMARY KEY ( Field1 ASC, Field2 ASC, Field3 ASC, Field4 ASC ) ); INSERT dbo.Persons ( Field1, Field2, Field3, Field4, Field5 ) SELECT x.n, x.n % 2, x.n % 3, x.n % 4, x.n % 5 FROM ( SELECT TOP ( 1000 * 1000 ) ROW_NUMBER() OVER ( ORDER BY 1 / 0 ) AS n FROM sys.messages AS m CROSS JOIN sys.messages AS m2 ) AS x;
您作為範例提供的查詢:
SELECT * FROM dbo.Persons AS p ORDER BY p.Field4
有一個排序操作可以按照您要求的順序放置東西。
但是這個查詢有不同的計劃:
SELECT * FROM dbo.Persons AS p WHERE p.Field1 = 1000000 AND p.Field2 = 0 AND p.Field3 = 1 ORDER BY p.Field4
通過跨列的相等謂詞導致您選擇的排序順序,支持索引中的數據順序。
我不確定您真正選擇沒有過濾器的每一列的頻率,但如果您有更多限制性查詢,則索引可能會滿足您的需求。