以下查询的执行速度大不相同。第二个比第一个快完成几个数量级。
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
如果有人会写出原因,那就太好了。
数据库为HSQLDB
,JDBC
。
其他信息:HSQLDB
的版本为2.3.2。并且列A.X被索引,但列B.Y不是。
答案 0 :(得分:1)
答案是:indexing
想象一下,我有一本字典,有人给我一个任务,可以找到5000个单词。这项任务需要几个小时 但现在想象一下这本词典是未分类的。我需要几年时间才能找到所有这些词语 计算机速度更快,第一项任务只需几毫秒,而第二项任务则需要几秒钟。
为什么第一个查询这么慢?
这是因为有INNER JOIN
并且它是在未编入索引的列上完成的。
为什么第二个查询如此之快?
这是因为有子查询。此子查询实现为临时表,并为连接列创建索引。所以你现在没有加入未编制索引的B表,而是使用索引的临时表。 HSQLDB在临时表上创建此索引以使其更容易加入。即使您将连接条件更改为更复杂(例如:A.X = B.Y + 2*B.Z
),此查询仍然会很快。这意味着HSQLDB在连接条件中使用表达式创建索引。