2011-05-24 86 views
1

這是我的簡單場景:SQL索引在兩列

我有一個Users表和一個Locations表。 一個用戶可以與許多地方所以我有一個用戶位置表,如下所示:現在

ID (int-Auto Increment) PK 
UserID (Int FK to the Users table) 
LocID (Int FK to the Locations table) 

中,ID是它在默認情況下在SQL-服務器索引的PK。我有點困惑的另外兩列:

OPT 1: IX_UserLocation_UserID_LocID

OR

OPT 2: Shud Shud我同時在列樣定義索引我定義了兩個單獨的索引,如:IX_UserLocation_UserID & IX_UserLocation_LocID

請原諒我,如果兩者都一樣 - 在這種情況下請解釋。如果不是 - 哪一個更好,爲什麼?

+4

您是否真的需要在聯結表中自動遞增代理'id'字段?這是爲了什麼?我會在2 FK列上創建一個複合主鍵。將針對該表執行哪些查詢?他們會通過'user','location'還是兩者來查找? – 2011-05-24 13:26:25

+0

謝謝你們。只是供參考 - ID列是我們的傳統,我們將其保留在所有表格中,在大多數地方它用於唯一記錄標識符的目的。我知道這裏UserID + LocID可以是一個複合PK,但爲了簡化和標準化,我們保留ID字段。如果這不是令人信服的 - 現在忘記ID鑰匙! – 2011-05-31 14:44:41

回答

0

你或許應該創建兩個單獨的索引。有一件經常被外鍵遺忘的事實是,刪除用戶可能會級聯刪除表中的用戶位置關係。如果在用戶標識上沒有索引,這可能會導致用戶位置關係的表鎖定。這同樣適用於刪除位置。

+0

是否有2個單獨的索引涵蓋UserID和LocID的where子句組合。性能有什麼不同? – Renae 2013-12-06 04:50:28

0

最好對s的方式etup所有索引,你認爲你需要在開發和檢查看你的應用程序運行的查詢query plans,看看索引讀取。

2

我們聘請數據庫有幾件事情。一個是快速信息檢索,另一個是聲明式參照完整性(DRI)。

如果您的要求是用戶可能只與給定位置相關一次,那麼您需要一個唯一索引UserID & LocatonID。

如果你的問題是如何快速檢索數據的答案是 - 這取決於。你如何訪問數據?如果你總是得到一組用戶的位置,那麼我可能會在用戶ID上使用一個聚集的非唯一索引。如果你的訪問是「誰在locatin x?」那麼你可能想在LocationID上使用一個聚集的非唯一索引。

如果你問這兩個問題,你可能會想要兩個索引(儘管你只能得到1個聚集,所以第二個索引可能想用INCLUDE來抓取另一個列)。無論哪種方式,你probalby不希望ID作爲聚集索引(在SSMS表設計器中將列標記爲PK時的默認值)。

HTH, -Eric

1

除了「gbn」的答案。它將取決於其中條款。無論您是使用用戶還是位置,還是同時使用