首页 > 解决方案 > 估计多个内连接后sql查询中的记录数

问题描述

我有 5 个表:Person,Table1,Table2,...Table4 以及我必须以任何我希望的方法评估其成本的查询。

select *
from Person P 
inner join
Table1 T1 on P.ID = T1.ID 
inner join
Table2 T2 on P.ID = T2.ID 
inner join
Table3 T3 on P.ID = T3.ID
inner join
Table2 T4 on P.ID = T4.ID
group by p.ID

Person 的主键是 ID,其他每个表都有一个指向 Person.ID 的外键。

我还知道每个表中的记录数,并且 Person 表中 90% 的人都出现在 Table1 中

60%的人出现在表2

70%的人出现在表3

55%的人出现在表4

(表1,...表2中的每个人都允许重复)

我也没有关于哪个人在哪个表/表中的数据。

现在,在执行内部连接之后,是否有任何方法可以估计基于数据创建的关系中的记录总数,以便计算 group by 子句中的排序成本?

提前致谢

标签: sqlinner-join

解决方案


介于 0% 和 55% 之间。如果您做出熟悉的统计假设,即这些值是独立的,那么您可以将估计值计算为:

0.9 * 0.60 * 0.70 * 0.55

这大约是 20%。然而,独立性是一个相当强的假设。如果不了解基础数据和分布,我仍然会保持 0% - 55% 的安全范围。

此外,此估计是基于在“其他”表中最多有一个匹配项。如果您有多个匹配项,那么估计当然可能会爆炸。而且,您还没有提到您正在使用的数据库,但 SQL 数据库不一定会对group by.


推荐阅读