我只是想最好地理解索引。
在第76页的第70-461页 - 查询Microsoft Sql Server 2012, 它表示当主要或唯一约束时,SQL Sever会自动创建唯一索引。
但是没有为外键创建索引。
因此,为了使连接更有效,最好只在外键上创建一个非聚集索引吗?
答案 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
,以便从Mytable
列ColumnFK1
中选择Description
。
如果您考虑将FK添加到unique
或pk
,只评估如果您要在同一个表中包含多个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子句。
索引不是免费的。
它们改进了选择但减慢了插入和更新。