SQL INNER JOIN在HSQLDB中自动优化

use*_*374 5 sql optimization hsqldb

以下查询的执行速度截然不同.第二个比第一个快完成几个数量级.

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
Run Code Online (Sandbox Code Playgroud)

如果有人会写出这是为什么会很好.该数据库是HSQLDBJDBC.

附加信息:版本HSQLDB是2.3.2.并且列AX被索引但列BY不是.

rtr*_*szk 1

答案是:indexing

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

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

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

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

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