Sql 连接结果的数据大小,如何优化?

Sql 连接结果的数据大小,如何优化?,sql,join,Sql,Join,假设我有一个表单查询: SELECT * FROM tbl1 LEFT OUTER JOIN tbl2 on tbl1.id = tbl2.user_id LEFT OUTER JOIN tbl3 on tbl3.submit_id = tbl2.user_id ..................................................... LEFT OUTER JOIN tbl3123 on tbl3123.mega_id = tbl223.super_hyper_

假设我有一个表单查询:

SELECT *
FROM tbl1
LEFT OUTER JOIN tbl2 on tbl1.id = tbl2.user_id
LEFT OUTER JOIN tbl3 on tbl3.submit_id = tbl2.user_id
.....................................................
LEFT OUTER JOIN tbl3123 on tbl3123.mega_id = tbl223.super_hyper_id;
我需要计算结果的数据大小(即行数)。我是否可以删除所有左外部联接并只编写以下查询:

SELECT COUNT(*)
FROM tbl1

结果I Revevive正确吗?

不正确,因为表tbl1中的一行可以匹配任何其他表中的多条记录

此查询:

SELECT COUNT(*)
FROM tbl1

如果只给出一个下限,您可以确保结果中至少会有那么多记录。

如果不事先知道联接,就无法概括这一点,因为计数将根据联接中的表和where子句而有所不同

假设你有表A和表B

左侧连接到tableb的Tablea为118行,内部连接到tableb的Tablea为107行,Tablea为89行,tableb为107行,Tablea的11行没有tableb记录。这是因为tablea与table b之间存在一对多关系,并且在创建tablea记录时,tableb中没有创建任何记录

或者,有可能左侧连接到table B的table a是1,00786行,而内部连接到table B的table a是987123行,而table a有89行(因为在这种情况下,多行是非常多的!)。或者你可以有一对一的关系,其中tablea有89条记录,tableb有89条记录,两个连接都有89条记录。或者表b可能有表A中不存在的孤立接收字,因为您在没有引用完整性的情况下糟糕地设计了数据库。或者表b可以是pranet表,表A可以是子表


在添加联接(以及任何where子句)之前,根本无法知道计数

否。其他表可能有重复的ID,从而导致行爆炸。@GordonLinoff是否有方法在一般情况下独立于表来优化查询?有方法获取记录计数和结果。它们取决于RDBMS和/或用于运行查询的应用程序。两个都未指定。是否要优化第一个查询的性能?如果是,您应该确保正确设置索引。如果您的规则是可以将任意数量(未知)的表连接在一起,并且无法预测它们中的哪一个可以位于连接的“多”端……那么答案是否定的。但您肯定有一个更具体的目标——即。,您试图计算的某些特定内容…在一般情况下可以优化查询吗?