Sql server 如果列是外键,它是否需要索引?

Sql server 如果列是外键,它是否需要索引?,sql-server,sql-server-2005,database-design,Sql Server,Sql Server 2005,Database Design,我已经在表中的许多列上创建了索引。其中许多列也是外键。我可以安全地删除外键列上的索引吗?SQL不会自动在外键列上创建索引,因此这些索引不是多余的。只有当你100%确定它们没有被使用时,才可以扔掉它们。不要这样做。索引的全部要点是它连接到另一个表,因此它几乎总是在查询中考虑因素,并且总是在连接它链接到的表的查询中考虑因素 保留外键并从中删除索引可能有什么原因?否。与主键不同,外键并不意味着索引。外键上的显式索引非常有用,因为外键通常用于联接,并且索引可以加速联接 您应该在完全覆盖测试之后(或在长时

我已经在表中的许多列上创建了索引。其中许多列也是外键。我可以安全地删除外键列上的索引吗?

SQL不会自动在外键列上创建索引,因此这些索引不是多余的。只有当你100%确定它们没有被使用时,才可以扔掉它们。

不要这样做。索引的全部要点是它连接到另一个表,因此它几乎总是在查询中考虑因素,并且总是在连接它链接到的表的查询中考虑因素


保留外键并从中删除索引可能有什么原因?

否。与主键不同,外键并不意味着索引。外键上的显式索引非常有用,因为外键通常用于联接,并且索引可以加速联接


您应该在完全覆盖测试之后(或在长时间的日常使用之后)进行查找,以了解哪些索引是可用的,哪些索引在考虑访问路径时被查询优化器忽略。这些统计数据在服务器重启后重置,因此它们不相关,除非应用程序运行了足够的时间,或者测试覆盖了数据上运行的每个查询,数据量真实。

通常,FK列上会有一个索引。当然是手动创建的

但是,如果没有对父表进行更新或删除,则可能不需要它。但是,除非这是一个瓶颈,为什么?SQL必须在某个时候检查关系,索引对于任何超过几十行的行都是非常重要的


为了管理数据空间的增长,我们特意删除了大型ish表(每天插入500万行)的一些FK列上的索引。不是表演。我们的唯一案例,否则我们总是有它们,除非110%证明不是这样。

视情况而定。外键上的索引会加速一些查询。当然,更新需要更长的时间,因为DBMS必须更新索引和表。有时候这是值得的

看一看合并加入策略。如果您的优化器使用此策略,它可以通过两次索引扫描在相关表和父表之间进行大规模连接。根据表的填充情况,这可能只需要循环连接策略所需时间的一小部分