正如我在本文中所理解的,在某些情况下,外键可以提高查询性能.
我听到了相反的说法,即由于参照完整性检查,外键实际上可能会损害查询性能.在哪种情况下(如果有的话)这是真的吗?
1)术语查询似乎具有误导性.我对各种表现处罚感兴趣.
2)是否有人对INSERT,DELETE或UPDATE语句的负面影响有任何实际数字(我知道这取决于特定的系统,但是,任何类型的真实世界测量都会受到赞赏)?
如果引用完整性需要外键,那么外键的存在应构成性能的基线
你不妨问一下,如果你不把座位放进去,一辆车可以走得更快 - 一辆造型良好的汽车包括座位,就像一个结构良好的数据库包括外键一样
我假设对于INSERT查询,约束 - 包括外键约束 - 会稍微降低性能.数据库必须检查您告诉它插入的内容是您的约束允许它插入的内容.
对于SELECT查询,外键约束不应对性能进行任何更改.
由于INSERTS几乎总是非常快,除了在边缘情况下,少量的额外时间将不会明显.(构建一个几千兆字节的数据库,您可能希望禁用约束,然后在以后重新启用,只要您确定数据是好的.)
理论上,是的:数据写入需要验证约束.
在实践中,很少:除非另有测量和证明,否则您可以假设没有性能影响.绝大多数情况下,由于其他问题而出现性能问题:
错误的架构设计(缺少索引,错误的聚簇索引选择)
争用(阻塞),再次由于错误的架构设计(表扫描保证锁冲突)
糟糕的查询设计
在设计良好的架构和良好的查询上,约束的成本将开始以非常高的吞吐量出现.发生这种情况时,有预防措施.
我的2c:永远不要牺牲一些难以捉摸的表现目标的正确性限制.在非常罕见的情况下,当约束确实是问题时,有测量结果表明情况就是这样,并且俗话说:如果你不得不问它需要多少费用,你就买不起.如果你不得不问问约束是否有问题,你就不能删除它们(没有违法行为).