表之间的性能和链接数

时间:2014-11-03 22:56:34

标签: sql database performance

我当前的架构越来越大,它们之间有30多个表和数百个链接。

换句话说,每个表都有三个或四个外键。

我的问题是:这么多链接会对性能产生影响吗?

你能举例说明原因吗?

2 个答案:

答案 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