【问题标题】:What columns to include on filtered index?过滤索引中要包含哪些列?
【发布时间】:2012-10-01 10:01:08
【问题描述】:

假设有一个名为 T1 的表

CREATE TABLE T1
(
  GID INT NOT NULL,
  Attrib1 BIT NOT NULL,
  Attrib1Date DATE NOT NULL,
  Attrib2 BIT NOT NULL,
  CONSTRAINT PK_T1 PRIMARY KEY (GID)
)

现在,我正在为查询创建索引,其中只有 Attrib1 等于 1 或 Attrib2 等于 1 的行是有趣的。假设只有 20% 的行是这样的。

请不要担心 Attrib1 与 Attribe2 的相关性 - 它们仅用于两个单独的示例。

使用过滤索引很明显——我的意思是:带有 WHERE 子句的 INDEX-es。但问题是要包括哪些列?

示例查询:

SELECT * FROM T1 WHERE Attrib1 = 1 ORDER BY Attrib1Date
SELECT * FROM T1 WHERE Attrib2 = 1

示例和问题 1)

哪个索引更正确?

CREATE NONCLUSTERED INDEX IX_Attrib1
ON T1 (Attrib1, Attrib1Date)
WHERE Attrib1 = 1

CREATE NONCLUSTERED INDEX IX_Attrib1
ON T1 (Attrib1Date, Attrib1)
WHERE Attrib1 = 1

CREATE NONCLUSTERED INDEX IX_Attrib1
ON T1 (Attrib1Date)
WHERE Attrib1 = 1

示例和问题 2)

构建只包含被过滤的列的过滤索引是否正确,例如:

CREATE NONCLUSTERED INDEX IX_Attrib2
ON T1 (Attrib2)
WHERE Attrib2 = 1

【问题讨论】:

标签: sql-server sql-server-2008 database-design


【解决方案1】:

首先,消除误解:

假设只有 20% 的行是这样的......使用起来很明显 过滤索引

不,一点也不明显。我认为有时需要考虑该指数的选择性约为 1%。通常,阈值引用为 5%。有一篇关于它的文章,但我不记得在哪里。在 Google 上搜索。

在您的 3 个变体上

在 T1 上创建非聚集索引 IX_Attrib1(Attrib1,Attrib1Date) WHERE Attrib1 = 1

由于 SQL Server 实现了过滤索引,因此索引键中需要 Attrib1。不过,将其放在位置 1 并不会使其具有很高的选择性。

在 T1 上创建非聚集索引 IX_Attrib1(Attrib1Date、Attrib1) WHERE Attrib1 = 1

这个比上面的更具选择性,并且会更可取。前置条件用于检查过滤索引的适用性,但之后,regular 查询引擎接管,它将执行正常的选择性检查等。

在 T1 (Attrib1Date) 上创建非聚集索引 IX_Attrib1 WHERE Attrib1 = 1

由于上述原因,这个不太理想,因为处理过程如下:

  1. 查询包含WHERE Attrib1 = 1 -> 可以考虑这个索引(有其他潜力)
  2. Attrib1Date 的选择性是否足够?
  3. 索引包含 (Attrib1Date + record-pointer) => 可以为这些请求提供服务,包括WHERE Attrib1 = 1 条件

在 #3 失败

在 T1 (Attrib2) 上创建非聚集索引 IX_Attrib2 WHERE Attrib2 = 1

是的,如果只是为了创建索引,您会这样做,并且包含该列是为了接管filtered index applicability 检查之外的常规查询优化器/引擎。

【讨论】:

  • 不幸的是,根据我在问题下的链接,通常需要在过滤索引中存储多余的附加列。
  • 谢谢马丁。我已经查看了 SO question and connect issue,尝试了一些事情并总结了我的理解。出于性能原因以及不在“查询优化器”中为过滤索引创建两个分支,这种实现有点意义。
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多