Я использую базу данных hypersql в проекте Java.
Я кэшировал таблицу с колонкой bigint "EVENT_DATE", в которой дата хранится как Long.
Каждая запись в операции INSERT имеет большее значение, чем та, которая уже сохранена в БД с вероятностью 99,9% (фактически всегда до тех пор, пока системные часы не будут обновлены в прошлое с помощью NTP), поэтому в большинстве случаев события сортируются перед INSERT.
Наиболее распространенной операцией является вставка, менее распространенной операцией является SELECT * WHERE EVENT_DATE> somevalue с небольшим количеством возвращаемых строк (около 1 КБ), а наименьшим обычным является DELETE WHERE EVENT_DATE
Я проверяю операции DELETE на БД с 1000000 упорядоченных записей на 100%, если я создаю простое удаление INDEX (CREATE INDEX EVENTS_INDEX ON PUBLIC.EVENTS (EVENT_DATE)) со случайной даты, что занимает 15 секунд (в среднем из 100 выборок). УНИКАЛЬНЫЙ индекс и индекс DESC занимают одно и то же время. Поиск MIN (EVENT_DATE) занимает менее 1 мс внутри индексированной таблицы.
Но если я вообще не индексирую этот столбец, удаление занимает всего 7 секунд, а поиск MIN - 3 секунды.
Я не понимаю, почему. Если поиск по MIN имеет значительное улучшение по сравнению с индексацией, почему удаление отсортированных строк имеет такое ухудшение?
Есть ли способ сказать HyperSql, что таблица отсортирована и удаление может просто найти запрошенный индекс и вырезать все после него?
Код создания таблицы:
public static final String tableEVENTSCreate = "CREATE CACHED TABLE PUBLIC.EVENTS (\r\n" +
" EVENT_ID BIGINT IDENTITY PRIMARY KEY,\r\n" +
" EVENT_UUID CHAR(36) NOT NULL,\r\n" +
" EVENT_DATE BIGINT,\r\n" +
" EVENT_CODE INTEGER,\r\n" +
" EVENT_MODULE INTEGER,\r\n" +
" EVENT_LEVEL INTEGER,\r\n" +
" EVENT_DESCRIPTION VARCHAR(2048),\r\n" +
" EVENT_LINKS VARCHAR(4096),\r\n" +
" EVENT_IO VARCHAR(36),\r\n" +
" EVENT_DEVICE VARCHAR(36),\r\n" +
" EVENT_ZONE VARCHAR(36),\r\n" +
" EVENT_KEY VARCHAR(36),\r\n" +
" EVENT_USER VARCHAR(36) \r\n" +
") ; ";
индекс просто:
"CREATE INDEX EVENTS_INDEX ON PUBLIC.EVENTS (EVENT_DATE);"
удаление:
"DELETE from PUBLIC.EVENTS WHERE EVENT_DATE<"+date
HSQLDB - последняя версия 2.5, пробовал также на 2.4.1