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

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列未建立索引。

最佳答案

答案是:indexing
想象一下,我有一本字典,有人给我一个任务,要在其中找到5000个单词。这项工作将花费我几个小时。
但是现在想象一下这本字典是未排序的。在其中找到所有这些单词将花费我数年的时间。
计算机速度更快,对于第一项任务,它只需要几毫秒,而第二项任务则需要几秒钟。

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

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

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

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

关于HSQLDB中的SQL INNER JOIN自动优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26123098/

10-12 18:45