【发布时间】: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