HSQLDB中SQL内部连接的自动优化

HSQLDB中SQL内部连接的自动优化,sql,optimization,hsqldb,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 如果有人能写下为什么会这样,那就太好了。 数据库是带有JDBC的HSQLDB 附加信息:HSQLDB的版本为2.3.2。列A.X是索引的,但列B.Y不是。答案是:索引 想象一下,我有一本字典,有人给了我

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

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
如果有人能写下为什么会这样,那就太好了。 数据库是带有JDBC的HSQLDB

附加信息:HSQLDB的版本为2.3.2。列A.X是索引的,但列B.Y不是。

答案是:索引

想象一下,我有一本字典,有人给了我一个任务,让我从中找出5000个单词。这项任务要花我几个小时。 但是现在想象一下,这本词典是未分类的。我要花好几年的时间才能在里面找到这些词。 计算机速度更快,第一项任务只需要几毫秒,而第二项任务只需要几秒钟

为什么第一个查询这么慢

这是因为存在内部联接,它是在未索引的列上完成的

为什么第二个查询这么快


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

您能测试第三个版本吗:从a.X=B.Y和B.Z=1的内部连接B中选择*吗?@JoëlSalamin这与第一个慢速版本的执行时间大致相同。这可能是因为B.Y没有索引。你能试试另一个版本,告诉我是否有性能增益/损耗:从内部连接中选择*,从B中选择*,其中a.X=B上的B.Z=1。Y@JoëlSalamin的行为与开篇文章中的第二个示例大致相同。是的,但可能和索引有关。我只是不明白这会是什么样子。你的B桌有多大?这绝对有道理。对于你所描述的,你有什么参考资料吗?