Как я могу оптимизировать индексирование для больших операций удаления с известным порядком столбцов? - PullRequest
0 голосов
/ 03 июля 2019

Я использую базу данных 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

...