0

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

在 70-461 的 pg 106 - Querying Microsoft Sql Server 2012 上,它说当主约束或唯一约束 SQL Sever 将自动创建唯一索引。

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

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

4

2 回答 2

1

不,您不需要为 创建一个indexforeign 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的 s ,MyTable因此它将从MytableColumnFK1Description.

如果您正在考虑将 FK 添加到uniquepk只是评估如果您将在同一张表中有许多 FK 会发生什么?

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

于 2013-08-28T11:02:54.513 回答
1

不知道问题是什么部分。

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

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

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

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

从本质上讲,FK 也经常用于 where 子句。

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

于 2013-08-28T13:11:40.380 回答