2011-05-24 29 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”的答案。它将取决于其中条款。无论您是使用用户还是位置,还是同时使用