外键索引

时间:2013-08-28 09:44:32

标签: tsql foreign-keys indexing

我只是想最好地理解索引。

在第76页的第70-461页 - 查询Microsoft Sql Server 2012, 它表示当主要或唯一约束时,SQL Sever会自动创建唯一索引。

但是没有为外键创建索引。

因此,为了使连接更有效,最好只在外键上创建一个非聚集索引吗?

2 个答案:

答案 0 :(得分:1)

不,您不需要为index创建foreign keys,也不会保证它会使联接更有效率。

创建unique和PK的索引以提高INSERT和UPDATE性能。

当您使用JOIN查询时,它会使用零或一个索引来搜索/扫描表格。
可以说你有几个像

这样的表
MyTable
(
  ID int (PK),
  Description varchar(max),
  ColumnFK int (FK to LookupTable) 
)
Table LookupTable 
(
   ID int (PK), 
   Description varchar(max)
)

SELECT MyTable.ID, MyTable.Description, MyTable.ColumnFK, LookupTable.Description
FROM MyTable 
INNER JOIN LookupTable 
   on LookupTable.ID = MyTable.ColumnFK,
WHERE ID between 5 and 10000

最有可能的是,探查者将使用index scan查找ID中的所有相关MyTable,以便从MytableColumnFK1中选择Description

如果您考虑将FK添加到uniquepk,只评估如果您要在同一个表中包含多个FK会发生什么?

请注意,我有意添加到谓词MyTable.Description并使其为varchar(max),以表明您将获得此类查询的数据。

答案 1 :(得分:1)

不确定问题的哪个部分。

索引用于强制执行唯一约束。

FK本质上不需要索引 但是如果FK有索引,查询优化器通常会在连接中使用它。

在此查询中,docMVEnum1.valueID是带索引的FK 查询优化器使用该索引 即使使用索引,它仍然是查询中最昂贵的部分。

select  docMVEnum1.sID, docEnum1.value
  from  docMVEnum1  
  join  docEnum1 
    on  docEnum1.valueID = docMVEnum1.valueID  

本质上,FK通常用于where子句。

索引不是免费的。
它们改进了选择但减慢了插入和更新。