【问题标题】:SQL INNER JOIN automatic optimization in HSQLDBHSQLDB中的SQL INNER JOIN自动优化
【发布时间】:2014-11-25 05:10:08
【问题描述】:

以下查询的执行速度有很大不同。第二个完成的速度比第一个快几个数量级。

SELECT * FROM A INNER JOIN B ON A.X=B.Y WHERE B.Z=1
SELECT * FROM A INNER JOIN (SELECT * FROM B) ON A.X=B.Y WHERE B.Z=1

如果有人能写出这是为什么,那就太好了。 数据库是HSQLDBJDBC

附加信息:HSQLDB 的版本是 2.3.2。 A.X 列已编入索引,但 B.Y 列未编入索引。

【问题讨论】:

  • 你能测试第三个版本吗:SELECT * FROM A INNER JOIN B ON A.X=B.Y AND B.Z=1
  • @JoëlSalamin 这与第一个慢版本的执行时间大致相同。
  • 这可能是因为B.Y 没有被索引。你能试试这个其他版本并告诉我是否有性能增益/损失:SELECT * FROM A INNER JOIN (SELECT * FROM B WHERE B.Z = 1) ON A.X=B.Y
  • @JoëlSalamin 这与开篇文章中的第二个示例的行为大致相同。是的,但可能与索引有关。我只是不明白这会是什么方式。
  • 你的桌子有多大B

标签: sql optimization hsqldb


【解决方案1】:

答案是:indexing

想象一下,我有一本字典,有人给我一个任务,让我在里面找到 5000 个单词。这项任务需要我几个小时。
但现在想象这本字典是未排序的。我需要好几年才能在其中找到所有这些词。
计算机速度更快,第一个任务只需要几毫秒,而第二个任务需要几秒钟。

为什么第一次查询这么慢?

这是因为有 INNER JOIN 并且它是在未索引的列上完成的。

为什么第二个查询这么快?

这是因为有子查询。该子查询具体化为临时表,并为连接列创建索引。所以你现在不是加入未索引的 B 表,而是加入索引的临时表。 HSQLDB 在临时表上创建此索引以使其更容易加入。即使您将连接条件更改为更复杂(例如:A.X = B.Y + 2*B.Z),此查询仍然会很快。这意味着 HSQLDB 在连接条件中使用的表达式上创建索引。

【讨论】:

  • 这绝对是有道理的。您可能对您所描述的内容有任何参考吗?
猜你喜欢
  • 2011-08-18
  • 2018-01-27
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 2013-07-01
相关资源
最近更新 更多