我当前的架构越来越大,它们之间有30多个表和数百个链接。
换句话说,每个表都有三个或四个外键。
我的问题是:这么多链接会对性能产生影响吗?
你能举例说明原因吗?
答案 0 :(得分:1)
外键/主键约束会影响
的性能插入(每个外键约束必须检查匹配的主键)
更新。对参与外键或主键约束的列的更新会触发约束验证逻辑。更新主键列,并且必须验证引用该主键的每个外键约束。更新外键列,必须根据主键进行验证。
就select
查询而言,假设您(和您的DBA)索引覆盖您正在进行的联接,它不应该对事物产生太大影响。但是, 都取决于执行计划的样子。如果您的联接可以执行索引查找,则您可能会查看O(log N)性能。如果必须进行表扫描,则需要考虑O(N)或可能的O(N 2 )性能。
事实上,窄表的连接实际上可能会加快速度。如果您有覆盖索引(索引中找到所需的所有列),则数据库引擎不必检索表的实际数据页。此外,窄表意味着每个数据页面的行数更多,因此获得所需数据的I / O更少。
但这完全取决于上下文:您需要分析查询的执行计划,看看他们实际在做什么。
答案 1 :(得分:0)
我不认为关系的数量会影响您的quiries的性能。当您开始加入表时会出现性能问题。如下文The myth of slow sql joins所述,它们似乎没有一个明显的性能命中。当然,这取决于数据集的大小,这可能会改变,但可能没有那么多。除了良好的索引,你可以考虑使用子查询。例如考虑以下sql代码:
SELECT * FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.FK = TABLE2.PK WHERE TABLE1.FIELD1 ='SOME VALUE'
您可以使用嵌套查询,稍后可以在视图上启用该查询,并限制表2中正在接收的行数:
SELECT * FROM TABLE1 INNER JOIN(SELECT * FROM TABLE2 WHERE TABLE2.SOMEFIELD ='SOME_VALUE_FOR_FIELD')ON TABLE1.FK = TABLE2.PK