【问题标题】:In SQL Server 2008, do relationships make queries faster?在 SQL Server 2008 中,关系是否使查询更快?
【发布时间】:2011-09-07 05:41:35
【问题描述】:

例如,如果我有一个BlogPosts 表和一个PostCategory 表,其中BlogPosts 表有一个FK 字段PostCategoryId。关系会使查询速度更快,还是更注重数据质量?

当涉及连接表时怎么办?将PostCategoryId 字段从BlogPosts 表中取出,并在它们“之间”有一个名为PostsInCategories 的表,它只有2 个FK 字段:BlogPostIdPostCategoryId,组合形成一个PK。

关系是否改善了那里的查询?

【问题讨论】:

  • 使用外键创建和使用附加表会减慢选择和修改速度。但是这种方法改进了设计
  • 我的理解是它实际上会使其变慢,但会帮助您保持参照完整性。如果您要进行绝对优化,关系通常会减慢您的速度。

标签: sql performance sql-server-2008


【解决方案1】:

外键关系是关于加强数据完整性,例如确保您没有任何不再有父行的“巫毒”子行,依此类推。

外键关系本身不会提高性能,因为 SQL Server不会自动为外键创建任何索引。

出于多种原因(在执行引用完整性和提高 JOIN 性能时提高性能 - 请参阅 Kimberly Tripp's blog post on the topic),非常推荐将索引添加到表中的所有外键字段 - 添加这些索引将加快查询速度这将使用那些 FK 关系。

【讨论】:

  • 谢谢 marc_s。我以为是这样,只是想确定一下。
  • “为所有外键字段添加索引”——这种笼统的建议是不合适的。通常的标准将适用,例如如果选择性很高(即 FK 中有许多重复值),则最好在高活动环境中省略索引(即许多更新)。
  • 当然,我阅读了 FK 部分,但它没有解决反观点,即省略 am 索引可能是一个好主意,即缺乏平衡。
  • “我还没有听说过为什么在 FK 列上建立索引是个坏主意”——我可以帮忙 :) 巧合的是,我今天早些时候正在查看 this article。背景:Access(又名 Jet)过去总是在 FK 的两侧添加索引,但后来他们意识到这并不总是一个好主意,因此引入了“快速外键”功能:
  • 引用:“在外键索引中的值高度重复的情况下,使用索引可能比简单地扫描表效率低。在插入和删除记录时维护这样的索引表,会进一步降低性能。”在我看来,SQL Server 也可以这样说,不是吗?
猜你喜欢
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多