假设我对多个字段具有唯一约束,如下所示:
ALTER TABLE mytable ADD CONSTRAINT UNIQ__mytable UNIQUE (field1, field2, field3);
这些字段具有以下类型:
field1: bigint
field2: int
field3: varchar(16)
现在,我想我将独自在field1
上进行大量的JOINS操作。为了获得最佳性能,我还需要在field1
上有特定的索引吗?
非常感谢您的帮助!
答案 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);
然后您将获得一个唯一的约束和一个唯一的索引,如下所示:
这将完全满足您在A列(在您的情况下为field1)中所做的连接。
答案 1 :(得分:3)
如果field1
为“窄”(例如int
,tinyint
等),且字段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 constraint
和unique index
来为您提供一些有趣的阅读内容
似乎两者都很好,仅取决于您真正想做的事情。