【问题标题】:If a Column is a Foreign Key does it need an Index? [duplicate]如果列是外键,它是否需要索引? [复制]
【发布时间】:2009-09-24 15:19:52
【问题描述】:

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

【问题讨论】:

    标签: sql-server sql-server-2005 database-design


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      SQL 不会自动在外键列上创建索引,因此这些索引不是多余的。仅当您 100% 确定它们未被使用时才丢弃它们。

      【讨论】:

        【解决方案3】:

        没有。与主键不同,外键并不意味着索引。外键上的显式索引很有用,因为外键经常用于连接,并且索引可以加快连接速度。

        您应该在全面覆盖测试之后(或经过长时间的日常使用)查找 sys.dm_db_index_usage_stats,以了解哪些索引是查询优化器在考虑访问路径时忽略了哪些索引。这些统计信息会在服务器重新启动后重置,因此它们无关紧要,除非应用程序已经运行了足够长的时间,或者测试已经覆盖了对数据运行的每个查询,并且具有真实的数据量。

        【讨论】:

          【解决方案4】:

          不要那样做。索引的全部意义在于它连接到另一个表,因此它几乎总是会考虑查询,并且总是会考虑连接它所链接的表的查询。

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

          【讨论】:

            【解决方案5】:

            这取决于。有一些查询会加快外键索引的速度。当然,更新需要更长的时间,因为 DBMS 必须更新索引和表。有时它是值得的。

            看一下合并连接策略。如果您的优化器使用此策略,它可以在有问题的表和父表之间进行大规模连接,只需两次索引扫描。根据表的数量,这可能需要循环连接策略所需时间的一小部分。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-11-15
              • 2011-03-04
              • 2013-11-11
              • 2013-01-28
              • 1970-01-01
              • 2010-12-15
              • 1970-01-01
              • 2021-01-08
              相关资源
              最近更新 更多