H2 НАМНОГО МЕНЬШЕ, чем HSQLDB в моем приложении Java?(оба inmem) - PullRequest
2 голосов
/ 05 марта 2019

Я уверен, что с моей стороны происходит что-то глупое.

У меня есть Java-приложение, где мне нужно постоянно запрашивать коллекцию из 2,5 миллионов объектов, поэтому я помещаю их вв памяти db.

Для этого я опробовал hsqldb v2.4.1 и h2 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", "");

или

con = DriverManager.getConnection("jdbc:hsql: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 с помощью PRIMARY KEY ()?В чем еще может быть проблема?

1 Ответ

0 голосов
/ 14 марта 2019

Каждый механизм БД имеет свою собственную реализацию и в некоторых случаях может вести себя по-разному.Я бы попробовал следующий запрос, я думаю, что индекс мог бы быть более эффективно использован и возвращает тот же результат:

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

В «порядке по» первый столбец на самом деле не требуется, так как уже отфильтрован, но какобъяснение здесь необходимо, чтобы ПЕРВИЧНЫЙ КЛЮЧ корректно использовался движком в плане выполнения.

...