运行于: SQL Server 2008 R2 Standard。尽管我认为这是所有数据库的问题,而不仅仅是 SQL Server。
背景:我一直听说/读过/被告知,索引的前沿应该是高度选择性的。当您有查询寻找特定值或一小组值时,这是有道理的——产品 ID 或类似的东西。
一般问题:有时非高选择性索引有用吗?
例如:我有一个包含 3.5 亿行的表。该表包含一堆价格。该表具有以下列:
priceId
-- 表上的聚集索引warehouseId
-- fk 到 10 个仓库之一,平均分布在150m 行中algorithmId
-- fk 到我计算价格的 23 种算法之一,平均分布在 1.5 亿行中priceDate
-- 我们上次计算价格的日期productId
然后我运行这个查询:
select productId
from price
where warehouseId = 1
and algorithmId = 1
order by priceDate
具体问题:我不会从这样的索引中受益吗?
create nonclustered index ix_p
on price (warehouseId, algorithmId, priceDate) includes (productId)
看来我会受益 b/c 我已经创建了一个覆盖索引,过滤器列组织得很好,这样 SQL Server 可以一次切出大块并按priceDate
. 那有意义吗?它有效吗?
注意:我要试试这个,然后告诉你我发现了什么。