2012-10-31 49 views
3

在多列主鍵的第一個字段上添加單獨的單列索引是多餘的嗎?這是否取決於第一列中與表格大小相比唯一值的相對數量?在多列主鍵的第一列上定義索引是多餘的嗎?

我的具體情況是,我用兩列和三列主鍵構建了幾個中等大小的表(20k-500k行)。這些表格中的第一列是與某個商業活動相對應的整數(我在這裏將其稱爲「活動」),第二列是產品ID(實際上是UPC)或商業位置標識符:

-- Activity - upc table: entire table is a two-column primary key 
CREATE TABLE activity_upc (
    activity_id int NOT NULL, 
    upc_id dec(18,0) NOT NULL, 
    CONSTRAINT PRIMARY KEY PK_activity_upc CLUSTERED (activity_id, upc_id) 
) 

-- One of several transaction tables, unique by activity, location, and date 
-- (date in SQL server is a 3-byte integer) 
CREATE TABLE activity_stuff (
    activity_id int NOT NULL, 
    location_id smallint NOT NULL, 
    transaction_date date NOT NULL, 
    [ other columns ], 
    CONSTRAINT PRIMARY KEY PK_activity_stuff CLUSTERED ( 
     activity_id, location_id, transaction_date) 
) 

有幾百個唯一的位置ID,幾千個唯一的活動ID和超過一百萬個唯一的UPC。我在location_id上有一個索引,因爲查詢的頻率很高,只有location_id在activity_id上添加一個單獨的索引會有幫助,或者是愚蠢和多餘的,它也經常用作單列過濾器嗎?

+0

索引支持查詢。我無法想象第二個索引如何幫助大家,但不知道您試圖調整的查詢是不可能的。任何不支持查詢的索引都是愚蠢的和多餘的 –

回答

2

它是多餘的。您可以通過添加/刪除索引並比較explain結果來輕鬆進行檢查。另一方面,對於組合鍵中的第二列,額外索引將有所幫助。

1

是的,索引鍵的基於左邊的子集通常是多餘的。

您還可以組合包含列。包含列的順序無關緊要。

例如:

索引1 - 列F,W,B

索引2 - 柱F,W;包括X

索引3 - 列F;包括電子

解決方案:

刪除索引1,2,和3

新指標4 - 列,F,W,B;包括E,X