【问题标题】:Create filtered index创建过滤索引
【发布时间】:2012-05-28 06:44:20
【问题描述】:

我想在 (Column1 = Column2) 条件下创建过滤索引:

CREATE NONCLUSTERED INDEX [IX_Document_IsBalanced]
ON [ACC].[Document] ([DocumentID] ASC)
WHERE SumCredit = SumDebit
ON [PRIMARY]
GO

错误信息是:

关键字“with”附近的语法不正确

【问题讨论】:

  • 请张贴您发布的声明
  • 另外:您可以在过滤后的索引表达式中进行 simple 检查 - 例如 WHERE Column1 IS NOT NULL 或类似的东西。但是,您不能比较两列值 - 您将收到错误 Msg 10735, Level 15, State 1, Line 2 Incorrect WHERE clause for filtered index 'ix_test' on table 'dbo.XXXXXXX'.
  • 我的 T-SQL 命令是: CREATE NONCLUSTERED INDEX [IX_Document_IsBalanced] ON [ACC].[Document] ([DocumentID] ASC) WHERE SumCredit = SumDebit ON [PRIMARY] GO
  • Quassnoi 的回答是正确的,但错误消息是抱怨WITH 附近的语法。那个代码在哪里?尝试创建过滤索引时出现的错误是 Incorrect WHERE clause for filtered index 'IX_Document_IsBalanced' on table 'Document'.

标签: sql sql-server-2008


【解决方案1】:

文档在这个问题上相当混乱,但你不能真正创建一个在这种条件下过滤的索引(因为它不能用于过滤统计信息)。

文档说:

过滤谓词使用简单的比较逻辑

没有明确定义“简单”,但实际上“简单”的意思是“可供过滤统计信息使用”。两者有相同的限制。

统计信息只能使用等式、范围和内列表而不是常量。这意味着您只能使用以下谓词:

column = const
column > const
column < const
column IN (const1, const1)

及其变体(BETWEEN 等),可能与 AND 结合使用(甚至不是 OR)。

【讨论】:

  • 我也成功地在过滤索引上使用了 !=。
【解决方案2】:

过滤索引是 SQL Server 2012 的功能 - 这是来自 MSDN 的documentation 语法

例如:

CREATE NONCLUSTERED INDEX FIBillOfMaterialsWithEndDate
    ON Production.BillOfMaterials (ComponentID, StartDate)
    WHERE EndDate IS NOT NULL ;
GO

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-01-21
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 2018-06-19
  • 1970-01-01
相关资源
最近更新 更多