注册
BITMAP索引在MERGE时“多版本操作冲突过多”
专栏/技术分享/ 文章详情 /

BITMAP索引在MERGE时“多版本操作冲突过多”

贾尚林 2024/05/31 961 0 0
摘要

本文详细描述了在BITMAP索引的表上,进行merge时,出现错误。但是update不会出现错误。

1、版本信息:

select * from v$version;
  • DM Database Server 64 V8
  • 8.1
  • 企业版
  • DB Version: 0x7000c
  • 03134283890-20220720-165295-10045

2、建表语句:

CREATE TABLE A02
(C1 NUMBER primary key
,C2 VARCHAR(10)
,C3 DATE
);

3、常规的merge语句

MERGE INTO A02 using (SELECT 11 C1,'11' C2,SYSDATE C3 FROM DUAL) B
ON(A02.C1=B.C1)
when matched then update set A02.C2=B.C2,A02.C3=SYSDATE
when not matched then INSERT(C1,C2,C3) values(B.C1,B.C2,B.C3);

commit;

select * from A02;

以上语句正常执行,插入一行。

4、创建BITMAP索引。

create bitmap index bidx_a02 on A02(C2);

5、再次运行上面的语句。

MERGE INTO A02 using (SELECT 11 C1,'11' C2,SYSDATE C3 FROM DUAL) B
ON(A02.C1=B.C1)
when matched then update set A02.C2=B.C2,A02.C3=SYSDATE
when not matched then INSERT(C1,C2,C3) values(B.C1,B.C2,B.C3);

commit;

出现如下错误提示

MERGE INTO A02
using (SELECT 11 C1,'11' C2,SYSDATE C3 FROM DUAL) B
ON(A02.C1=B.C1)
when matched then update set A02.C2=B.C2,A02.C3=SYSDATE
when not matched then 
  INSERT(C1,C2,C3) values(B.C1,B.C2,B.C3);
执行失败(语句1)
多版本操作冲突过多

1条语句执行失败

6、删除BITMAP索引

drop index bidx_a02;

7、再次运行MERGE语句,成功。

MERGE INTO A02 using (SELECT 11 C1,'11' C2,SYSDATE C3 FROM DUAL) B
ON(A02.C1=B.C1)
when matched then update set A02.C2=B.C2,A02.C3=SYSDATE
when not matched then INSERT(C1,C2,C3) values(B.C1,B.C2,B.C3);

commit;  

select * from A02;

8、单独运行UPDATE语句更新带有BITMAP索引的表,不会出现错误。

UPDATE A02 SET C2='1144',C3=SYSDATE-2 WHERE C1=11;

commit;

select * from A02;

分享结束。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服