两列的SQL索引

问题描述

| 这是我的简单情况: 我有一个用户表和一个位置表。一个用户可以与许多位置相关,因此我有一个UserLocation表,如下所示:
ID (int-Auto Increment) PK
UserID (Int FK to the Users table)
LociD (Int FK to the Locations table)
现在,由于ID是PK,因此认情况下在sql Server中将其编入索引。我对其他两列感到有些困惑:   OPT 1:Shud我在两列上都定义了一个Index:   IX_UserLocation_UserID_LociD      要么      OPT 2:Shud我定义了两个单独的索引,例如:IX_UserLocation_UserID   &IX_UserLocation_LociD 请原谅我是否都做同样的事情-在这种情况下,请解释一下。如果不是-哪个更好,为什么?     

解决方法

您可能应该创建两个单独的索引。外键通常会忘记的一件事是,删除用户可能会级联删除表中的用户位置关系。如果userID上没有索引,则可能导致用户位置关系的表锁。删除位置也是如此。     ,你需要 2列 UserID(将FK转换为Users表) LocID(位置表为Int FK) 两个ѭ1上有一个PK 反向ѭ2的另一个索引 您可能不需要两个索引,但是很少 编辑,一些指向其他答案的链接 SQL:您需要用于许多表的自动增量主键吗? SQL-多对多表主键 2个索引与以相反顺序定义的列之间的差异     ,我们为数据库租用了几件东西。一种是快速信息检索,另一种是声明性参照完整性(DRI)。 如果您要求一个用户只能与给定位置相关一次,则需要在UserID和LocatonID上具有唯一索引。 如果您的问题是如何快速检索数据,答案是-这取决于。您如何访问数据?如果您总是获得用户的整个位置集,那么我可能会在UserID上使用聚集的非唯一索引。如果您的访问权限是“谁在locatin x中?”,那么您可能希望在LocationID上使用聚集的非唯一索引。 如果您都问这两个问题,您可能会希望同时使用两个索引(尽管只有1个群集,所以第二个索引可能要使用INCLUDE来获取另一列)。 无论哪种方式,probalby都不希望ID作为聚簇索引(在SSMS表设计器中将列标记为PK时的默认设置)。 HTH, -埃里克     ,除了“ gbn \”答案。这将取决于Where子句。无论您是使用用户还是位置,或者同时使用两者     ,设置您认为需要在开发上所需的所有索引并查看应用运行的查询的查询计划以及查看读取哪些索引的最佳方法。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...