我有一个表,在 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
我有一个要优化的查询,如下所示:
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)
HugeView
不幸的是,上述所有限制都是产品设计和/或开发范围的一部分——我对此无能为力——只能在我拥有的范围内工作。
但是,我知道它@var
是 1 或 0,并且可以根据需要创建和查询(并加入)临时表或“真实”表。
另请注意,我没有从Col1
or的表中进行选择Col2
- 我仅将它们用于过滤。
我尝试在空表上创建和加入,或者top(@somevar)
根据@var
的值 - 但没有帮助。
UNION ALL
不会有帮助,因为在任何情况下优化器都不知道 …