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查询成本的理论评估的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询优化的短路评估

第十五周翻译-《Pro SQL Server Internals, 2nd edition》

用于评估多行的 SQL 查询

SQL 编译错误:无法在 Snowflake 中评估不受支持的子查询类型

SQL 编译错误:无法评估不受支持的子查询类型 - SELECT 子句中的函数调用

如何在SQL中为当前年度成本和上一年成本编写查询?