SQL Server 2012过滤索引 - Where子句太复杂了

时间:2014-01-03 21:21:06

标签: sql-server sql-server-2012

我正在尝试创建以下过滤索引:

CREATE NONCLUSTERED INDEX [MyIndex] ON [dbo].[MyTable]
(
    [MovedToODS] ASC
)
INCLUDE 
(   
    [sub_id],
    [read_time]
) 
WHERE ([read_time]>='1/1/2012' OR [LastModifiedTime] > [MovedToODS])

我收到以下错误:

  

Msg 156,Level 15,State 1,Line 8
  关键字“OR”附近的语法不正确。

过滤索引不支持这样的Where子句吗?在线文档只是说Where子句支持“简单操作”。这太复杂了吗?

1 个答案:

答案 0 :(得分:6)

是的,您的WHERE条款过于复杂;我完全不支持OR。你甚至不能这样做:

CREATE TABLE dbo.floob(id INT);

CREATE INDEX x ON dbo.floob(id) WHERE id = 1 OR id = 2;

在这种情况下,当然有一个支持的替代方案:

CREATE INDEX x ON dbo.floob(id) WHERE id IN (1,2);

这对你没有帮助。但是,如果您的工作负载有意义地独立使用它们,那么您可以创建两个独立的筛选索引。例如:

WHERE [read_time]>='20120101' AND [LastModifiedTime] <= [MovedToODS]
...
WHERE [read_time]<'20120101' AND [LastModifiedTime] > [MovedToODS]

讨论各种限制的一些不错的参考文献:

http://sqlfool.com/2009/04/filtered-indexes-what-you-need-to-know/

http://www.brentozar.com/archive/2013/11/what-you-can-and-cant-do-with-filtered-indexes/

http://www.sqlperformance.com/2013/04/t-sql-queries/filtered-indexes