外键是在SQL Server中自动索引的吗?
以下SQL语句会自动在Table1.Table1Column上创build一个索引,还是必须显式创build一个索引?
数据库引擎是SQL Server 2000
CREATE TABLE [Table1] ( . . . CONSTRAINT [FK_Table1_Table2] FOREIGN KEY ( [Table1Column] ) REFERENCES [Table2] ( [Table2ID] ) )
SQL Server不会自动在外键上创build索引。 另外从MSDN:
FOREIGN KEY约束不必仅链接到另一个表中的PRIMARY KEY约束; 它也可以被定义为引用另一个表中的UNIQUE约束的列。 FOREIGN KEY约束可以包含空值; 但是,如果组合FOREIGN KEY约束的任何列包含空值,则会跳过组成FOREIGN KEY约束的所有值的validation。 要确保复合FOREIGN KEY约束的所有值都已validation,请在所有参与的列上指定NOT NULL。
当我读到Mike的问题时,他询问FK Constraint是否会在FK所在表格(Table1)中的FK列上创build一个索引。 答案是否定的,一般来说。 (为了约束的目的),不需要这样做。另一方面,定义为约束的“TARGET”的列必须是被引用表中的唯一索引,或者是主键或备用钥匙。 (唯一索引)或Create Constraint statment将失败。
(编辑:添加到明确处理下面的评论 – )具体来说,当提供一个外键约束的数据一致性。 索引只会影响FK端的行或行的删除,从而影响DRI Constraint的性能。 当使用约束时,在插入或更新期间,处理器知道FK值,并且必须检查PK侧的引用表中是否存在一行。 那里已经有一个索引。 在PK侧删除一行时,必须确认FK侧没有行。 在这种情况下,索引可以有一定的帮助。 但这不是一个常见的情况。
除此之外,在某些types的查询中,查询处理器需要在使用该外键列的连接的多方查找logging。 当该外键上存在索引时,联接性能会增加。 但是这种情况在连接查询中使用FK列是特有的,而不是外部键约束的存在。无论连接的另一端是PK还是其他任意列,都无关紧要。 另外,如果你需要过滤或者sorting基于FK列的查询结果,索引将会有帮助…再一次,这与该列上的外键约束无关。
不,在列上创build外键不会自动在该列上创build索引。
无法索引外键列将导致每次从引用(父)表中删除一个logging时,该表被扫描。
在这个示例模式中:
CREATE TABLE MasterOrder ( MasterOrderID INT PRIMARY KEY) CREATE TABLE OrderDetail( OrderDetailID INT, MasterOrderID INT FOREIGN KEY REFERENCES MasterOrder(MasterOrderID) )
每次在MasterOrder表中删除logging时,都会扫描OrderDetail。
由于索引会影响插入,更新和删除操作,因此如果父表logging从不删除,则可能不总是要引发开销外键。