mysql - SQL查询成本的理论评估

标签 mysql sql oracle performance query-optimization

我需要通过分析结果和查看的行数来评估理论 中的 SQL 查询。 欢迎任何指向在线信息的链接,因为我无法在任何地方找到有关此问题的帮助

我在类里面学到了什么

假设我有 2 个表,

  • A 包含 100 个元组
  • B 包含 500 个元组。

符号:|A|是查询后的元组数 {A} 是为生成查询而检查的元组数

我已经看到了

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

我的问题

  • A 包含 50 个元组
  • B 包含 100 个元组。

R = |A JOIN B|

我的老师说 {A JOIN B} 花费 150,通过 B 花费 100,通过 A 花费 50。但为什么这个 50*100 不像前面的示例那样?

他进一步说,在联合成本 5000 之后应用的限制,联合表中的总行数为 1500。行数不是50*100吗?

最佳答案

如果结果为 Cartesian product,则结果中的行数为 50*100 = 5,000 .

也就是说,如果连接没有条件,那么 A 的每一行都会连接到 B 的每一行,并且您会得到一个包含行的每个组合的结果。

但是如果连接有一些限制,那么您通常会得到一个小得多的行集。你的老师假设了一个例子,其中满足条件的两个表之间的组合数给出了 1,500 行的结果。

5,000 行结果将是最大可能的结果。可能有其他连接条件会给出不同的结果,如果 A 和 B 中的行组合都不满足条件,甚至会出现零行。

关于mysql - SQL查询成本的理论评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43442404/

相关文章:

php - 停止apache时出现以下错误

php - 网络机器人可以增加下载量吗?

sql - 导入 Oracle 数据转储并覆盖现有数据

java - 如何处理 Jooq 中的日期?

sql - 使用 dbms_random.value 和指定的比例创建

oracle - 如何使用查询获取2个给定日期之间的月份列表?

php - 使用 PHP 和 WordPress 中的复选框更新 MySQL 表

mysql - mysql建表出错

java - 查询 DSL 左连接查询

sql - 当存储为 BINARY XML 时,Oracle XMLType 有多大