我只是想最好地理解索引。
在 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 子句。
索引不是免费的。
它们改进了选择,但减慢了插入和更新速度。