在我的Java应用程序中,H2比HSQLDB慢多少?(均为inmem)

在我的Java应用程序中,H2比HSQLDB慢多少?(均为inmem),h2,hsqldb,H2,Hsqldb,我相信我这边一定有什么蠢事 我有一个Java应用程序,我需要在其中不断重复查询250万个对象的集合,因此我将它们放入内存数据库中 为此,我试了一下 hsqldb v2.4.1 及 氢 v1.4.198 对于两者,我使用完全相同的创建表: String createRateTable = "CREATE MEMORY TABLE INTEREST_RATES " + "(EFFECTIVE_DATE DATE not NULL, "

我相信我这边一定有什么蠢事

我有一个Java应用程序,我需要在其中不断重复查询250万个对象的集合,因此我将它们放入内存数据库中

为此,我试了一下 hsqldb v2.4.1 及 氢 v1.4.198

对于两者,我使用完全相同的创建表:

String createRateTable = "CREATE MEMORY TABLE INTEREST_RATES " +
                                "(EFFECTIVE_DATE DATE not NULL, "
                                + "INTEREST_RATE DOUBLE, "
                                + "INTEREST_RATE_CD BIGINT, "
                                + "INTEREST_RATE_TERM BIGINT, "
                                + "INTEREST_RATE_TERM_MULT VARCHAR(50),"
                                + "PRIMARY KEY (EFFECTIVE_DATE, INTEREST_RATE_CD, INTEREST_RATE_TERM, INTEREST_RATE_TERM_MULT))";
唯一的区别是连接,或者

con = DriverManager.getConnection("jdbc:h2:mem:ftp", "SA", "");

例如,一个经常触发的查询是:

SELECT * 
from INTEREST_RATES 
where INTEREST_RATE_CD = ? 
  and EFFECTIVE_DATE = (SELECT MIN(EFFECTIVE_DATE) 
                        from INTEREST_RATES 
                        where INTEREST_RATE_CD = ?)
现在

至于Hsql,应用程序将在大约2分钟内完成

对于H2,在>8分钟后仍然没有完成


我的H2设置有什么问题?这里似乎没有创建索引,就像Hsql在主键()的帮助下所做的那样?还有什么问题吗?

每个DB引擎都有自己的实现,在某些情况下可能表现不同。 我将尝试以下查询,我认为索引可以更有效地使用,并返回相同的结果:

SELECT * 
from INTEREST_RATES 
where INTEREST_RATE_CD = ?
order by INTEREST_RATE_CD, EFFECTIVE_DATE
limit 1;

在“订购人”中第一列并不是必需的,因为它已经被过滤了,但正如所解释的,它是必需的,这样执行计划中的引擎就可以正确地使用主键。

这里可以看到类似的性能结果:也许你这边没有什么错,hsqldb只是更快了?是的,但这就像是日夜的差异,这让我觉得我没有正确设置H2…HSQLDB同时优化了主查询和子查询。尝试解释从利率中选择*的计划。。。查看它如何使用主键索引。查询优化通常不会反映在许多所谓的“性能测试”中,这些测试使用非常简单的查询。
SELECT * 
from INTEREST_RATES 
where INTEREST_RATE_CD = ?
order by INTEREST_RATE_CD, EFFECTIVE_DATE
limit 1;