2010-07-21 205 views
41

我對開發人員更喜歡使用哪種技術來強制執行SQL Server中的唯一性感興趣:UNIQUE CONSTRAINT或UNIQUE INDEX。鑑於每一個的物理實現沒有什麼區別,你如何決定哪個最好?唯一約束vs唯一索引

除了性能評估最佳解決方案,還有其他原因嗎?

是否有數據庫管理優勢之一?

回答

30

這個MSDN文章比較這兩個是SQL Server 2000:http://msdn.microsoft.com/en-us/library/aa224827(SQL.80).aspx

在大多數情況下,沒有任何區別 - 約束來作爲幕後的索引。儘管有禁用約束的功能,但它在SQL Server中並不實際。

它只是如果你想調整像FILLFACTOR等的東西,你想要實現唯一約束的方式。

SQL Server 2008+增加了INCLUDE以提供更高效的覆蓋索引。已過濾的索引=行的子集上的唯一約束/忽略多個空等。

+2

該文章很好。有趣的是,除了元數據之外,它總結出「沒有實際的區別」。 – bobs 2010-07-21 04:39:28

+0

嘖嘖,引用MSDN的SQL Server 2000 – gbn 2010-07-21 05:02:51

+2

@gbn:是的,但有什麼改變? – 2010-07-21 05:06:54

26

它們是not significantly different.當你創建一個唯一約束時,SQL Server會自動爲你創建一個唯一的索引。

隨着語法創建索引,可能有更好的控制定義唯一索引來指定clustered /非聚集,包含的列,文件組,索引濾波(SqlSvr2008)等

約束是優選在最因爲它表達了唯一性的意圖:它是一個約束。索引沒有傳達這個意圖。

至於可管理性,影響最小。您可以管理索引(重建,重組),就像它獨立於約束創建一樣。唯一的區別是約束依賴於索引,因此要刪除索引,還必須刪除約束。

+1

+1我還想說一致性,以及你通常最終將約束更改爲索引以添加INCLUDE – gbn 2010-07-21 05:04:18

1

唯一性約束意味着唯一性,約束的刪除將刪除引擎創建的索引。一個索引可以被改變,以消除它的唯一性,你仍然有你的索引。我認爲可以假定,大多數專欄將強制獨特性也很好地作爲性能原因的指標; ergo,我大多使用獨特的索引。我只在需要唯一但性能不佳的列(即varchar(200)需要唯一)上使用唯一約束。在這種情況下,我想清楚地指出,儘管存在潛在的索引,但它可能不是一個好主意,但它可能不是一個好主意。

2

我的兩分錢:當我想要提高性能時,我想用描述業務邏輯和索引的約束。他們可以在DBMS中實現相同的事實並不意味着定義這些對象的原因之間的區別並不重要。