在单线程模式下进行多次插入/更新时在oracle db中使用位图索引

问题描述 投票:0回答:1

我有一个关于在 oracle 中使用位图索引的问题...

上下文:我的应用程序是分析系统,读取次数过多,无法在网络应用程序中查看计算的统计数据。数据以单线程模式从一个微服务加载到数据库,该微服务从队列中读取事件。事件 - 每天 500k(大约),平均速度约为 20rps

问题:使用各种sql查询来计算统计信息,性能很低..我尝试使用btree索引来加快性能,但不成功..查询需要几十秒才能完成..

我考虑使用位图索引来提高性能..你能给我一些关于它的建议吗...我读了很多关于位图索引、并发事务的文档...和问题..但我有单线程模式。 .也许有人面临同样的问题..如果我开始使用位图,我是否会遇到问题..

sql oracle data-warehouse
1个回答
0
投票

一般来说,位图索引用于基数较低的列,即不同值的数量较少(与表/分区中的记录总数相比)

在许多示例中,您会看到这样的索引:

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
。一些指南甚至建议每次您想要添加新数据时截断整个表并立即插入“所有”数据。但我认为在很多情况下这是不切实际的。

© www.soinside.com 2019 - 2024. All rights reserved.