【问题标题】:Data modeling: (Why) Should I always create indexes on the FK columns?数据建模:(为什么)我应该总是在 FK 列上创建索引吗?
【发布时间】:2016-09-07 03:12:08
【问题描述】:

考虑以下场景:

ParrentLookupTable:

  • PK:SomeCode CHAR(10)
  • 只有 5 行。
  • 不经常更换

我的表:

  • 每天添加一百万行。
  • SomeCode FK 到 ParrentLookupTable
  • 没有基于 SomeCode 进行搜索或排序的查询

这是FK的定义

ALTER TABLE MyTable  CONSTRAINT FK_MyTable_ParrentLookupTable_SomeCode FOREIGN KEY(SomeCode)
REFERENCES ParrentLookupTable (SomeCode)

我应该创建索引 IX_MyTable_SomeCode 吗?

在这种写入密集型工作负载场景中,索引会消耗 IO,我不确定它有什么用处?

【问题讨论】:

  • 那么你将如何保持完整性?您是否要创建自定义代码代码(如触发器)以保持完整性?或者你会有夜间工作来管理诚信?
  • @KannanKandasamy:抱歉,缺少 FK 定义。我用 FK 定义更新了问题。
  • “MyTable”是否包含很多列?
  • 你认为为什么需要在子表上添加索引?

标签: sql-server indexing data-modeling


【解决方案1】:

一般来说在父表的列上加索引是为了加快FK检查。在这种情况下,它可能根本没有帮助。 ParentLookupTable 将适合一个数据库页面,因此它是否在进行表扫描或索引查找应该无关紧要。

在子表的 FK 列上添加索引有助于级联删除。

这里有一篇关于这个主题的更长的文章 http://sqlperformance.com/2012/11/t-sql-queries/benefits-indexing-foreign-keys

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-24
    • 2021-07-27
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2018-05-06
    相关资源
    最近更新 更多