SQL查询成本的理论评估
Posted
技术标签:
【中文标题】SQL查询成本的理论评估【英文标题】:Theoretical evaluation of SQL query cost 【发布时间】:2017-04-16 21:35:01 【问题描述】:我需要通过分析结果和查看的行数来评估 理论 中的 SQL 查询。 欢迎任何在线信息链接,因为我无法在任何地方找到有关此问题的帮助。
我在课堂上学到了什么
假设我有 2 张桌子,
一个包含 100 个元组 B 包含 500 个元组。注解:|A| is the number of tuples after the query
A is the number of tuples examined to produce the query
我已经看到了
R = |A JOIN B| = 500 (we take the biggest of the two)
A JOIN B = 100 * 500 = 50 000 (we need to check every tuple)
R' = |R WHERE NO=1| = 5 (we suppose each no has 5 occurences)
R' = 500 (we had to loop through the 500)
R'' = |R'[name]| ~5
R'' = 5
我的问题
一个包含 50 个元组 B 包含 100 个元组。R = |A JOIN B|
我的老师说 A JOIN B 花费 150,经过 B 花费 100,经过 A 花费 50。但是为什么这个 50*100 不像前面的示例那样?
他进一步说,在联合成本 5000 之后应用的限制,联合表中的总行数为 1500。行数不会是50*100吧?
【问题讨论】:
【参考方案1】:如果结果为Cartesian product,则结果中的行数为 50*100 = 5,000。
也就是说,如果连接上没有条件,那么 A 的每一行都连接到 B 的每一行,你会得到一个包含所有行组合的结果。
但是,如果连接有一些限制,那么您通常会得到一组更小的行。您的老师假设了一个示例,其中满足条件的两个表之间的组合数给出了 1,500 行的结果。
5,000 行结果将是最大可能的结果。如果 A 和 B 中的行组合都不满足条件,则可能存在其他连接条件会给出不同的结果,甚至可以减少到零行。
【讨论】:
以上是关于SQL查询成本的理论评估的主要内容,如果未能解决你的问题,请参考以下文章
第十五周翻译-《Pro SQL Server Internals, 2nd edition》
SQL 编译错误:无法在 Snowflake 中评估不受支持的子查询类型