2009-08-28 60 views
3

因为guid的值始终是唯一的,所以为什么要使用唯一的索引。是不是真的,当你使用一个唯一的索引,它会减慢插入?在Guid Column上使用唯一索引的要点是什么

+2

GUID *不*保证是唯一的。重复的机会很渺茫,但不是零。他们可能实际上是零,但数学上的弯曲和我强烈的挑剔性质坚持我指出你可能会得到重复的可能性。 – paxdiablo 2009-08-28 05:22:16

回答

5

的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也可以引用一个UNIQUE 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约束在可空列中实施唯一性。

0

这是一个约束;不是索引。

因为数据建模器希望在给定表的所有记录中只有一个GUID实例。

+0

注意,尽管唯一性约束的有效实现几乎需要使用某种形式的索引。 – 2009-08-28 05:24:11

+0

需要? SQL Server(截至2005年)只能为主键创建一个索引;我看到了与Oracle 9i +类似的行为,但可能是PL/SQL Developer。 – 2009-08-28 05:35:46

+0

但是在SQL Server中,这个约束是通过索引 – 2009-08-28 05:46:29

0

我想你可能会混淆一点独特的约束和唯一索引的想法。尽管如果您确信数据将是唯一的,但唯一约束可能不会太有用,但唯一索引将为该表创建该列的实际“索引”。从本质上讲,这可以在查询该列时提供更好的性能。

1

唯一约束将最终在表上创建唯一索引。虽然他们有不同的语法结果是相同的。参考here.

如果您的表没有声明主键,则唯一约束将在表上创建CLUSTERED索引,否则它将在表上创建非CLUSTERED索引。一个表只能有一个CLUSTERED索引和多个非CLUSTERED索引。

紧凑列(其上具有CLUSTERED索引)长度允许更多索引条目适合给定的8-KB页面,从而减少I/O,增加缓存命中并加速字符匹配。聚簇索引键用作所有非聚簇索引中的书签,因此长聚簇键会增大所有索引的大小并降低I/O效率。所以我认为负责创建聚簇索引或非聚簇索引的列应该具有最小长度。现在由于GUID已经具有唯一性,GUID的大小很大,所以可以在其他大小比较小的其他列上创建索引。

+0

来实现的,我的主键是一个INT,并且我有一个GUID列作为UNIQUE CONSTRAINT。这个好吗? – user161433 2009-08-28 06:35:56

+0

你有INT主键,它将确保表中唯一的行。你将能够使用这个int主键从任何其他表中获得外键引用。如果您的Employee表具有emp_id和ssn数字,则两者都可以被认为是唯一的。这些列对在设计术语中通常被称为备用键或候选键。实际上,使用PRIMARY KEY约束将两列中的一列逻辑升级为主键,另一列通常由UNIQUE约束声明。前端使用您不会使用GUID。所以我认为它不是必需的。 – Nirlep 2009-08-28 14:23:20

1

首先,正如已评论 - GUID不保证是100%唯一的。此外,如果有人想出了一个“让我们创建自己的东西看起来像一个GUID”的方案,并向您发送了必须导入到数据库中的数据,那么您可能仍然希望确保表中存在唯一的约束。另外,正如其他人指出的那样,您需要将唯一索引的唯一约束区分开来。在SQL Server内部,两者都是作为唯一索引实现的,以实现唯一性。

但是,如果您专门创建了唯一索引,那么您可以使用此索引从外键关系中的另一个表中引用该表。通常,这只适用于表的主键 - 但它也适用于唯一的索引。这是一个关于SQL Server的鲜为人知的事实 - 请参阅Kimberly Tripp的blog post了解她如何发现它:-)

因此,如果您在表的GUID列上放置UNIQUE INDEX,则可以引用该表/列将其用于参考完整性目的。

马克