SQL INNER JOIN在HSQLDB中自动优化

时间:2014-09-30 14:16:29

标签: 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

如果有人会写出原因,那就太好了。 数据库为HSQLDBJDBC

其他信息:HSQLDB的版本为2.3.2。并且列A.X被索引,但列B.Y不是。

1 个答案:

答案 0 :(得分:1)

答案是:indexing

想象一下,我有一本字典,有人给我一个任务,可以找到5000个单词。这项任务需要几个小时 但现在想象一下这本词典是未分类的。我需要几年时间才能找到所有这些词语 计算机速度更快,第一项任务只需几毫秒,而第二项任务则需要几秒钟。

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

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

为什么第二个查询如此之快?

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