在多列主键的第一个字段上添加单独的单列索引是多余的吗?它是否取决于第一列中唯一值的相对量与表的大小相比?
我的具体情况是我正在使用两列和三列主键构建几个中等大小的表(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上添加单独的索引会有用,或者是愚蠢和多余的,也经常用作单列过滤器?
答案 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