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上添加一个单独的索引是否有帮助,或者是愚蠢和多余的,它也经常用作单列过滤器?

4

2 回答 2

2

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

于 2012-10-31T15:52:10.003 回答
1

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

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

例如:

索引 1 - F、W、B 列

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

索引 3 - F 列;包括 E

解决方案:

删除索引 1、2 和 3

新索引 4 - 列、F、W、B;包括 E、X

于 2012-10-31T16:04:15.430 回答