因为guid值总是唯一的,为什么要使用唯一索引。当您使用唯一索引减慢插入时,这是不是真的?
答案 0 :(得分:6)
UNIQUE约束的使用:
实施唯一性。虽然生成的GUID很可能是唯一的,但您可以轻松地在多行中插入相同的GUID。当然你可以错误地做到这一点,但这甚至可能是你设计的一部分,例如多对多表中的复合键约束。
CREATE TABLE BookAuthors (
guid INT PRIMARY KEY,
BookGuid INT NOT NULL,
AuthorGuid INT NOT NULL,
FOREIGN KEY (BookGuid) REFERENCES Books(BookGuid),
FOREIGN KEY (AuthorGuid) REFERENCES Authors(AuthorGuid),
UNIQUE KEY (BookGuid, AuthorGuid)
);
作为外键的目标。您可能习惯于FOREIGN KEY引用父表的PRIMARY KEY。您是否知道FOREIGN KEY也可以引用一个独特的键?
CREATE TABLE Acknowledgements (
guid INT PRIMARY KEY,
BookGuid INT NOT NULL,
AuthorGuid INT NOT NULL,
Acknowledged VARCHAR(100) NOT NULL,
-- this works because of the UNIQUE constraint in BookAuthors:
FOREIGN KEY (BookGuid, AuthorGuid)
REFERENCES BookAuthors (BookGuid, AuthorGuid)
);
性能。 UNIQUE是一种约束,正如其他人所指出的那样,但在大多数品牌的数据库中,当您定义UNIQUE,PRIMARY KEY或FOREIGN KEY约束时,隐式索引。你插入任何索引表时会有一些开销是正确的,但索引的性能优势是净赢,通常是很多次。
唯一性尽管为NULL。虽然主键对于使用标识表中的行至关重要,但它们不允许NULL。您可以使用UNIQUE约束来强制可空列中的唯一性。
答案 1 :(得分:1)
唯一约束最终将在表上创建唯一索引。虽然他们有不同的语法结果是相同的。参考here.
如果您的表没有声明主键,则唯一约束将在表上创建CLUSTERED索引,否则它将在表上创建非CLUSTERED索引。一个表只能有一个CLUSTERED索引和多个非CLUSTERED索引。
精简列(其上带有CLUSTERED索引)长度允许更多索引条目适合给定的8 KB页面,从而减少I / O,增加缓存命中率并加快字符匹配。聚簇索引键在所有非聚簇索引中用作书签,因此长聚簇键将增加大小并降低所有索引的I / O效率。所以我认为负责创建聚簇索引或非聚簇索引的列应该具有最小长度。现在,由于GUID已经具有唯一性,因此GUID的大小很大,您可以在其他一些列上创建索引,这些列的大小相对较小。
答案 2 :(得分:1)
首先,正如已经评论过的那样 - GUID不保证是100%唯一的。另外,如果有人梦想“让我们自己创建一个看起来像GUID”的方案并向你发送你必须导入数据库的数据,你可能仍然希望确保你的表有一个独特的约束
此外,正如其他人所指出的那样,您需要将唯一约束与唯一索引区分开来。在SQL Server内部,两者都作为唯一索引实现,以强制实现唯一性。
但是如果您专门创建一个唯一索引,那么您可以使用此索引从外键关系中的另一个表引用该表。通常,它仅适用于表的主键 - 但它也可以对唯一索引起作用。这是关于SQL Server的一个鲜为人知的事实 - 请参阅Kimberly Tripp关于她如何发现它的blog post :-)
因此,如果在表的GUID列上放置UNIQUE INDEX,则可以引用该表/列,从而将其用于参照完整性目的。
马克
答案 3 :(得分:0)
这是一个约束;不是索引。
因为数据建模者希望在给定表的所有记录中只有一个GUID实例。
答案 4 :(得分:0)
我认为您可能会混淆一个独特约束和唯一索引的想法。虽然如果您确定数据将是唯一的,唯一约束可能不会太有用,但唯一索引将为该表创建该列的实际“索引”。从本质上讲,这可以在查询该列时为您提供更好的性能。