【发布时间】:2009-09-24 15:19:52
【问题描述】:
我已经在我的表中的许多列上创建了索引。其中许多列也是外键。我可以安全地删除作为外键的列上的索引吗?
【问题讨论】:
标签: sql-server sql-server-2005 database-design
我已经在我的表中的许多列上创建了索引。其中许多列也是外键。我可以安全地删除作为外键的列上的索引吗?
【问题讨论】:
标签: sql-server sql-server-2005 database-design
通常你会在 FK 列上有一个索引。当然是手动创建的。
但是,如果父表上没有更新或删除,那么您可能不需要它。但是,除非它是一个瓶颈,否则为什么呢? SQL 必须在某个时候检查关系,并且索引对于超过几十行的任何内容都非常重要..
为了管理数据空间增长,我们特意删除了大型表(每天插入 500 万行)的某些 FK 列上的索引。 不是性能。我们唯一的案例,否则我们总是有它们,除非 110% 证明不是这样。
【讨论】:
SQL 不会自动在外键列上创建索引,因此这些索引不是多余的。仅当您 100% 确定它们未被使用时才丢弃它们。
【讨论】:
没有。与主键不同,外键并不意味着索引。外键上的显式索引很有用,因为外键经常用于连接,并且索引可以加快连接速度。
您应该在全面覆盖测试之后(或经过长时间的日常使用)查找 sys.dm_db_index_usage_stats,以了解哪些索引是查询优化器在考虑访问路径时忽略了哪些索引。这些统计信息会在服务器重新启动后重置,因此它们无关紧要,除非应用程序已经运行了足够长的时间,或者测试已经覆盖了对数据运行的每个查询,并且具有真实的数据量。
【讨论】:
不要那样做。索引的全部意义在于它连接到另一个表,因此它几乎总是会考虑查询,并且总是会考虑连接它所链接的表的查询。
保留外键并从中删除索引的可能原因是什么?
【讨论】:
这取决于。有一些查询会加快外键索引的速度。当然,更新需要更长的时间,因为 DBMS 必须更新索引和表。有时它是值得的。
看一下合并连接策略。如果您的优化器使用此策略,它可以在有问题的表和父表之间进行大规模连接,只需两次索引扫描。根据表的数量,这可能需要循环连接策略所需时间的一小部分。
【讨论】: