2009-08-28 71 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,則可以引用該表/列將其用於參考完整性目的。

馬克

相關問題