我有一个关于在 oracle 中使用位图索引的问题...
上下文:我的应用程序是分析系统,读取次数过多,无法在网络应用程序中查看计算的统计数据。数据以单线程模式从一个微服务加载到数据库,该微服务从队列中读取事件。事件 - 每天 500k(大约),平均速度约为 20rps
问题:使用各种sql查询来计算统计信息,性能很低..我尝试使用btree索引来加快性能,但不成功..查询需要几十秒才能完成..
我考虑使用位图索引来提高性能..你能给我一些关于它的建议吗...我读了很多关于位图索引、并发事务的文档...和问题..但我有单线程模式。 .也许有人面临同样的问题..如果我开始使用位图,我是否会遇到问题..
一般来说,位图索引用于基数较低的列,即不同值的数量较少(与表/分区中的记录总数相比)
在许多示例中,您会看到这样的索引:
CREATE BITMAP INDEX IND_GENDER ON EMP (GENDER);
通常,
GENDER
只有两个不同的值,例如male
和 female
(现在可能更多一点)。
但是,一张只有一个位图索引的表没有多大意义。典型的用例是拥有多个位图索引,并且您的典型查询对多个列有条件。单个位图索引不会使您的查询具有选择性,但是多列的组合使查询具有选择性且快速。
提示:也许您的要求是在具有许多不同值的
DATE
列上建立索引。位图索引没有多大意义,但是您可以创建位图索引,例如日和月值,例如
CREATE BITMAP INDEX IND_END_TIME_MONTH ON ROUTES (TRUNC(END_TIME, 'MM'));
CREATE BITMAP INDEX IND_END_TIME_DAY ON ROUTES (TO_CHAR(END_TIME, 'DD'));
当然,您必须相应地调整查询以启用 Oracle 使用索引。
是的,位图索引可能会在多用户环境中导致问题,更准确地说,如果多个用户对同一个表/分区进行更新/插入。这个主题对您来说似乎不是问题。
另一个问题是修改。位图索引不会对记录进行一一索引,索引值是在块上完成的。当您更新/插入/删除记录时,将计算整个块的索引值,而不仅仅是单个记录。
当您插入数据时,首选方法是将数据插入到 TEMP 表中,然后使用
CREATE GLOBAL TEMPORARY TABLE ROUTES_TEMP (...)
ON COMMIT PRESERVE ROWS;
INSERT INTO ROUTES_TEMP (...) VALUES (...);
INSERT INTO ROUTES_TEMP (...) VALUES (...);
INSERT INTO ROUTES_TEMP (...) VALUES (...);
INSERT INTO ROUTES (...)
SELECT ...
FROM ROUTES_TEMP;
批量插入也可能有效,但我没有测试。或者你可以处理
EXCHANGE PARTITION
。一些指南甚至建议每次您想要添加新数据时截断整个表并立即插入“所有”数据。但我认为在很多情况下这是不切实际的。