在SQL Server中,如果我在多个字段上都有UNIQUE约束,是否需要在这些字段之一上建立索引?

时间:2018-10-11 13:36:36

标签: sql-server

假设我对多个字段具有唯一约束,如下所示:

ALTER TABLE mytable ADD CONSTRAINT UNIQ__mytable UNIQUE (field1, field2, field3);

这些字段具有以下类型:

field1: bigint
field2: int
field3: varchar(16)

现在,我想我将独自在field1上进行大量的JOINS操作。为了获得最佳性能,我还需要在field1上有特定的索引吗?

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

在SQL Server中创建唯一约束时,引擎还将在约束中指定的字段上创建唯一索引(保持相同的顺序)。因此,例如,您有下表:

CREATE TABLE foo(A INT NOT NULL, B NVARCHAR(20) NOT NULL, C INT NOT NULL, D CHAR(4) NULL);

,您将创建一个像这样的唯一约束:

ALTER TABLE dbo.foo ADD CONSTRAINT UNIQ_foo_A_B_C UNIQUE (A,B,C);

然后您将获得一个唯一的约束和一个唯一的索引,如下所示:

enter image description here

这将完全满足您在A列(在您的情况下为field1)中所做的连接。

答案 1 :(得分:3)

如果field1为“窄”(例如inttinyint等),且字段2和3较宽(以至于您扩展了每个索引900字节的限制)键),可能仅在field1上创建“窄”索引是有意义的。该索引可以从每页存储更多索引键中受益。

S Karras has said一样,这里已经有一个 索引,可用于满足基于field1的谓词。

因此,如果您想尝试此操作,请添加索引并尝试一些常见查询以查看其是否已使用。

答案 2 :(得分:0)

S.Krras是正确的,您将自动获取索引。我一直只是直接制作索引。您可能要考虑使用unique covering index。像这样:

CREATE UNIQUE NONCLUSTERED INDEX [your_index_name] ON [dbo].[your_table_name]
(
    [field1] ASC,
    [field2] ASC,
    [field3] ASC
)

如果您加入field1并从其他字段返回数据,这将为您带来约束性能的好处。 SQL中有很多技巧可以尝试进行性能调整。查看您的执行计划以了解真正需要做的事情总是一个好主意。

使用unique constraintunique index来为您提供一些有趣的阅读内容

https://www.mssqltips.com/sqlservertip/4270/difference-between-sql-server-unique-indexes-and-unique-constraints/

似乎两者都很好,仅取决于您真正想做的事情。