Sql-Server

主鍵約束排序

  • July 8, 2019

主鍵約束中的欄位是否優化了表的排序?

這是表的架構:

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主鍵約束是否有助於優化上述排序查詢,即使主鍵約束是使用field1 then field2thenfield3field4?

它可以幫助您查詢的某些變體。以這個設置為例:

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

堅果

通過跨列的相等謂詞導致您選擇的排序順序,支持索引中的數據順序。

我不確定您真正選擇沒有過濾器的每一列的頻率,但如果您有更多限制性查詢,則索引可能會滿足您的需求。

引用自:https://dba.stackexchange.com/questions/242288