小编Man*_*man的帖子

无法使用 IGNORE_DUP_KEY = ON 创建 UNIQUE 过滤索引

我有一个表,在 SQL Server 2012 企业版中,我想要一个唯一的索引IGNORE_DUP_KEY = ON,但是我只希望这个索引(并忽略重复项)仅应用于表的一个子集 - 仅带有FLAG = 1.

CREATE TABLE [dbo].[FOO]
([ID] NOT NULL,
[Value] [int] NULL,
[FLAG] [bit] NULL)
Run Code Online (Sandbox Code Playgroud)

尝试使用以下查询创建索引时

CREATE UNIQUE NONCLUSTERED INDEX [IDX_UQ_FL_FOO_VALUE] ON [dbo].[FOO]
([Value] ASC)
WHERE [flag] = 1
WITH (IGNORE_DUP_KEY = ON)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

消息 10618,级别 16,状态 1,第 1 行无法在表 'dbo.FOO' 上创建过滤索引 'IDX_UQ_FL_FOO_VALUE',因为该语句将 IGNORE_DUP_KEY 选项设置为 ON。重写该语句,使其不使用 IGNORE_DUP_KEY 选项。

不能将过滤的唯一索引与IGNORE_DUP_KEY = ON?

将索引设置为非唯一不是一个选项。我需要它是唯一的来过滤重复的插入,但仅当插入带有FLAG = 1. 我需要忽略重复行的插入,而不是失败。

sql-server duplication sql-server-2012 filtered-index unique-constraint

3
推荐指数
1
解决办法
1529
查看次数

如何获得更好的空集执行计划?

我有一个要优化的查询,如下所示:

SELECT 1 FROM HugeView
WHERE (Col1 = 'a' AND @val = 1) OR (Col2 = 'a' AND @Val = 0)

(where Col1 and Col2 are on different tables)
Run Code Online (Sandbox Code Playgroud)

如果我对@Val值 (1/0) 进行硬编码- SQL Server 知道构建一个执行计划,在该计划中它只访问Col1或的相关表Col2

但是当使用一个变量时,所有的表都会HugeView被访问。

您能否建议一种可以帮助 SQL Server 不访问不必要表的方法?

限制:

  • 不能用 option (recompile)
  • 无法将此代码封装在 SP 中
  • 无法改变 HugeView

不幸的是,上述所有限制都是产品设计和/或开发范围的一部分——我对此无能为力——只能在我拥有的范围内工作。

但是,我知道它@var是 1 或 0,并且可以根据需要创建和查询(并加入)临时表或“真实”表。

另请注意,我没有从Col1or的表中进行选择Col2- 我仅将它们用于过滤。

我尝试在空表上创建和加入,或者top(@somevar)根据@var的值 - 但没有帮助。

UNION ALL不会有帮助,因为在任何情况下优化器都不知道 …

sql-server optimization execution-plan

1
推荐指数
1
解决办法
157
查看次数