我正在尝试创建以下过滤索引:
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
子句支持“简单操作”。这太复杂了吗?
答案 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