如何优化具有已知列顺序的大型删除操作的索引?

时间:2019-07-03 16:24:38

标签: java indexing hypersql

我在java项目中使用hypersql数据库。 我缓存了带有bigint列“ EVENT_DATE”的表,该表将日期存储为Long。 INSERT操作中的每条记录的值都大于已存储在DB中的一条记录,其概率为99.9%(实际上一直到系统时钟由NTP更新到过去为止),因此在大多数情况下,事件在INSERT之前进行排序。 最常见的操作是插入,不太常见的操作是SELECT * WHERE EVENT_DATE>返回值少的行(约1k)的某个值,而最不常见的操作是DELETE WHERE EVENT_DATE <影响值大的行(100k +)的somevalue,这是一个问题

如果我创建从随机日期中删除的简单INDEX(在PUBLIC.EVENTS(EVENT_DATE)上创建CREATE INDEX EVENTS_INDEX),我将在具有1000000条100%有序记录的数据库上测试DELETE操作,这需要15秒(平均100个样本)。 UNIQUE索引和DESC索引花费相同的时间。在索引表内搜索MIN(EVENT_DATE)的时间少于1ms。 但是,如果我根本不索引此列,则删除仅需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上尝试过

0 个答案:

没有答案