在多列主键的第一列上定义索引是多余的吗?

时间:2012-10-31 15:49:01

标签: sql-server indexing

在多列主键的第一个字段上添加单独的单列索引是多余的吗?它是否取决于第一列中唯一值的相对量与表的大小相比?

我的具体情况是我正在使用两列和三列主键构建几个中等大小的表(20k到500k行)。这些表中的第一列是一个整数,它对应于某个业务活动(我在这里只称它为“活动”),第二列是产品ID(实际为UPC)或业务位置标识符:< / p>

-- 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 )
)

有数百个唯一的locaton ID,数千个唯一的活动ID以及超过一百万个唯一的UPC。我在location_id上有一个索引,因为仅location_id查询是非常频繁的。 在activity_id上添加单独的索引会有用,或者是愚蠢和多余的,也经常用作单列过滤器?

2 个答案:

答案 0 :(得分:2)

这是多余的。您可以通过添加/删除索引并比较explain结果来轻松检查它。另一方面,对于复合键中的第二列,附加索引将有所帮助。

答案 1 :(得分:1)

是的,基于左侧的索引键子集通常是多余的。

您还可以组合包含列。包含列的顺序无关紧要。

例如:

索引1 - 列F,W,B

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

指数3 - 列F;包括E

<强>解决方案:

删除索引1,2和3

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