sql - 估计多个内连接后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 子句中的排序成本?
提前致谢
解决方案
介于 0% 和 55% 之间。如果您做出熟悉的统计假设,即这些值是独立的,那么您可以将估计值计算为:
0.9 * 0.60 * 0.70 * 0.55
这大约是 20%。然而,独立性是一个相当强的假设。如果不了解基础数据和分布,我仍然会保持 0% - 55% 的安全范围。
此外,此估计是基于在“其他”表中最多有一个匹配项。如果您有多个匹配项,那么估计当然可能会爆炸。而且,您还没有提到您正在使用的数据库,但 SQL 数据库不一定会对group by
.
推荐阅读
- python - ValueError:传递值的形状为 (39, 1),索引暗示 (39, 7)
- java - 无法在 Spring Boot 和 PostgreSQL 之间配置 SSL 连接
- c# - C# 中的 ApiController 未读取变量
- asp.net-core - ASP.NET Core 中的@Helpers
- c# - C#如何覆盖只有get方法的字段?
- angular - 当我使用@input 传递数据时,我的数据会发生什么
- php - 通过 url 在 laravel 中传递布尔参数
- twilio - 如何设置简单的 IVR
- sql-server - 来自存储过程 .NET Core 和 Entity Framework 的多个返回集
- php - 为学说 mongo 创建 Sylius 网格