2012-10-01 62 views
0

比方说,有一个叫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的相互作用 - 它们只给出两个单独的例子。

很明显,使用过滤索引 - 我的意思是:INDEX -ES与WHERE子句。但问题是包含哪些列?

示例查询:

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 

OR

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

OR

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

实施例和问题2)

是否正确建立由仅含柱过滤索引进行过滤,像:

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

(http://stackoverflow.com/q/10897198/73226) –

回答

2

首先,消除了误解:

比方说,现在只有20%这样的行......很明显使用 过滤索引

不,这不是很明显在所有。我认为该指数有时需要考虑1%左右的选择性。通常,门槛值为5%。有一篇关于它的文章,但我不记得在哪里。在Google上搜索它。

在你的3个变种

创造一个Attrib1 = 1

因为SQL Server的执行筛选索引的,Attrib1在需要非聚集索引IX_Attrib1 ON T1(Attrib1,Attrib1Date) 索引键。尽管如此,将它置于位置1并不会使其非常具有选择性。

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

这个比上述更具有选择性,并且将是优选的。预条件用于检查过滤索引的适用性,但是在这之后,定期查询引擎接管,其将执行正常选择性检查等

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

出于上述原因,这个人是不理想的,这是因为处理过程转到:

  1. 查询包含WHERE Attrib1 = 1 - >该指数可以考虑(与其他潜力)
  2. Attrib1Date选择性是否足够?
  3. 索引包含(Attrib1Date +记录指针)=>可以把这些服务的请求,其中包括WHERE Attrib1 = 1条件

它无法在#3

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

是的,你如果只拿到索引创建这样做,和列的包括用于常规查询优化器/ EN gine超越了filtered index applicability检查。

+0

在过滤索引存放多余的附加列不幸往往按我的链路所需的问题在[选择时,一些行为来考虑。 –

+0

谢谢马丁。我浏览了SO问题和连接问题,尝试了一些事情并总结了我的理解。由于性能方面的原因以及在“查询优化器”中为过滤后的索引创建两个分支,实现类型是有意义的。 – RichardTheKiwi