我在表格中的许多列上创建了索引。其中许多列也是外键。我可以安全地删除外键列上的索引吗?
答案 0 :(得分:4)
通常你会在FK列上有一个索引。当然是手动创建的。
但是,如果父表上没有更新或删除,那么可能不需要它。但是,除非它是瓶颈,为什么呢? SQL必须在某个时刻检查关系,索引对于任何超过几十行的内容都非常重要。
为了管理数据空间的增长,我们故意在一些FK列上删除了一个大型表(每天插入500万行)的索引。 不表现。我们唯一的情况,否则我们总是拥有它们,除非110%证明不是。
答案 1 :(得分:1)
SQL不会自动在外键列上创建索引,因此这些索引不是多余的。只有当你100%确定不使用它们时才放弃它们。
答案 2 :(得分:1)
没有。与主键不同,外键不表示索引。外键的显式索引很有用,因为外键经常在连接中使用,索引可以加速连接。
在完全覆盖测试之后(或在经过一些长时间的日常使用之后),您应该查看sys.dm_db_index_usage_stats,以了解哪些索引了解查询优化器在考虑您的访问路径时会忽略哪些索引。这些统计信息在服务器重新启动后会重置,因此它们无关紧要,除非应用程序运行了足够的时间或测试已覆盖数据的每个查询运行,并且具有实际数据量。
答案 3 :(得分:0)
不要那样做。索引的重点是它连接到另一个表,所以它几乎总是考虑到查询,并且总是考虑加入它所链接的表的查询。
保留外键并从中删除索引有什么可能的原因?
答案 4 :(得分:0)
这取决于。有一些查询表明外键上的索引会加速。当然,更新需要更长的时间,因为DBMS必须更新索引以及表。有时它值得。
看看合并加入策略。如果您的优化器使用此策略,它可以在所讨论的表与父表之间进行大量连接,只需两次索引扫描。根据表的数量,这可能只需要一小部分循环连接策略所需的时间。