外键是否在 SQLServer 中自动索引?

下面的 SQL 语句是自动在 Table1.Table1Column 上创建索引,还是必须显式创建索引?

数据库引擎是 SQLServer2000

       CREATE TABLE [Table1] (
. . .
CONSTRAINT [FK_Table1_Table2] FOREIGN KEY
(
[Table1Column]
) REFERENCES [Table2] (
[Table2ID]
)


)
37334 次浏览

SQLServer 不会自动为外键创建索引。同样来自 MSDN:

FOREIGNKEY 约束不具有 只能链接到主密钥 约束放在另一个表中; 它可以 也被定义为引用 中的 UNIQUE 约束的列 另一张桌子,一把外国钥匙 约束可以包含空值; 但是,如果一个合成材料的任何一列 FOREIGNKEY 约束包含空 价值,验证所有价值 组成外国钥匙 跳过约束 复合外国数据的所有值 验证 KEY 约束,指定 所有参与者的 NOT NULL 柱子。

当我读 Mike 的问题时,他在问 FK 约束是否会在 FK 所在的表中的 FK 列上创建一个索引(表1)。答案是否定的。另一方面,定义为约束的“ TARGET”的列必须是引用表中唯一的索引,要么是主键,要么是备用键。(惟一索引) ,否则 CreateConstraint 语句将失败。

(编辑: 添加到明确处理下面的评论 -) 具体来说,在提供外键约束所用的数据一致性时。只有当删除 FK 端的一行或多行时,索引才会影响 DRI 约束的性能。在使用约束时,在插入或更新过程中,处理器知道 FK 值,并且必须检查 PK 端的引用表中是否存在行。那里已经有一个索引。当删除 PK 端的行时,它必须验证 FK 端没有行。在这种情况下,索引可能会有些许帮助。但这种情况并不常见。

然而,除此之外,在某些类型的查询中,查询处理器需要在使用该外键列的联接的许多方面查找记录。当外键上存在索引时,联接性能 增加。但是这个条件是在联接查询中使用 FK 列所特有的,而不是存在外键约束... ... 联接的另一端是 PK 还是其他任意列并不重要。另外,如果您需要筛选,或者根据 FK 列对查询结果进行排序,索引将有所帮助... ... 同样,这与该列的外键约束没有任何关系。

不,在列上创建外键不会自动在该列上创建索引。未能索引外键列将导致在下列每种情况下进行表扫描:

  • 每次从引用(父)表中删除一条记录时。
  • 每次两个表在外键上联接时。
  • 每次更新 FK 列时。

在这个示例模式中:

CREATE TABLE MasterOrder (
MasterOrderID INT PRIMARY KEY)


CREATE TABLE OrderDetail(
OrderDetailID INT,
MasterOrderID INT  FOREIGN KEY REFERENCES MasterOrder(MasterOrderID)
)

每次删除 MasterOrder 表中的记录时,都将扫描 OrderDetail。每次加入 OrderMaster 和 OrderDetails 时,整个 OrderDetails 表也将被扫描。

   SELECT ..
FROM
MasterOrder ord
LEFT JOIN OrderDetail det
ON det.MasterOrderID = ord.MasterOrderID
WHERE ord.OrderMasterID = @OrderMasterID

一般来说,不索引外键比索引规则更为例外。

不为外键编制索引的情况是,外键永远不会被使用。这将使得服务器维护它的开销变得不必要。类型表可能时不时地属于这个类别,例如:

CREATE TABLE CarType (
CarTypeID INT PRIMARY KEY,
CarTypeName VARCHAR(25)
)


INSERT CarType .. VALUES(1,'SEDAN')
INSERT CarType .. VALUES(2,'COUP')
INSERT CarType .. VALUES(3,'CONVERTABLE')


CREATE TABLE CarInventory (
CarInventoryID INT,
CarTypeID INT  FOREIGN KEY REFERENCES CarType(CarTypeID)
)

一般假设 CarType。CarTypeID 字段永远不会被更新,删除记录几乎永远不会发生,维护 CarInventory 索引的服务器开销。如果 CarInventory 从未被 CarTypeID 搜索过,那么 CarTypeID 将是不必要的。