我只是想最好地理解索引。
在 70-461 的 pg 106 - Querying Microsoft Sql Server 2012 上,它说当主约束或唯一约束 SQL Sever 将自动创建唯一索引。
但是没有为外键创建索引。
因此,为了使连接更有效,最好只在外键上创建一个非聚集索引?
我只是想最好地理解索引。
在 70-461 的 pg 106 - Querying Microsoft Sql Server 2012 上,它说当主约束或唯一约束 SQL Sever 将自动创建唯一索引。
但是没有为外键创建索引。
因此,为了使连接更有效,最好只在外键上创建一个非聚集索引?
不,您不需要为 创建一个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
的 s ,MyTable
因此它将从Mytable
列ColumnFK1
和Description
.
如果您正在考虑将 FK 添加到unique
或pk
只是评估如果您将在同一张表中有许多 FK 会发生什么?
请注意,我有意添加到谓词中MyTable.Description
并将其设为 varchar(max) 以表明您将获得此类查询的数据。
不知道问题是什么部分。
索引用于强制执行唯一约束。
FK 本质上不需要索引。
但是如果 FK 有索引,查询优化器会经常在连接中使用它。
在此查询中,docMVEnum1.valueID 是一个带有索引的 FK。
查询优化器使用了该索引。
即使有了索引,它仍然是查询中最昂贵的部分。
select docMVEnum1.sID, docEnum1.value
from docMVEnum1
join docEnum1
on docEnum1.valueID = docMVEnum1.valueID
从本质上讲,FK 也经常用于 where 子句。
索引不是免费的。
它们改进了选择,但减慢了插入和更新速度。