SQL INNER JOIN在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没有。

答案是:indexing

想象一下,我有一本字典,有人给我一个任务,在里面找5000个单词。这个任务需要我几个小时
但现在想象一下,这本字典没有分类。我要花很多年才能在里面找到所有这些单词。
计算机速度更快,第一项任务只需要几毫秒,而第二项任务只需几秒钟。

为什么第一个查询如此缓慢

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

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

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

最新更新