20131209位图索引影响性能、使用绑定变量提高性能

本文探讨了位图索引在并发场景下对性能的影响,特别是在更新或插入操作时可能导致的等待问题,并提出了解决方案。此外,还介绍了如何通过使用绑定变量来提升批量插入操作的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、位图索引影响性能
采用位图索引,一个键指向多行,如果更新或插入一个位图索引键,那么这个键所指向的所有记录都会被锁定,从而导致其他会话的等待.
比如有人插入一个新记录.位图索引键值为'N',就会锁定位图索引中的N键,而这会同时锁定另外的所有为N的记录,此时,如果其他人想插入N值或者更新为N值的行,都需要等待.

create table x(id int ,flag char(1));
create bitmap index x_idx_b on x(flag);---创建位图索引

--先插入一条数据
insert into x values(1,'N'); 
commit;
--提交后再插入一个数据
insert into x values(2,'N');
--另外开启一个窗口执行,发现需要等待
insert into x values(3,'N');
--再开启一个窗口执行,发现也需要等待
update x set flag ='Y' where id =1;

直到第一个会话提交后,另外两个会话中的一个才会执行完成,然后再提交执行完成的会话,第三个会话才会执行完成.(后面两个会话的执行顺序还不知道是怎样的)
所以,位图索引在这样高并发的情况下不宜使用.那么这样的低基数的字段该怎样建索引呢?
如果这样的低基数只有2,3个值,且数据分布均匀,则不建索引.
如果数据有明显的倾斜,则利用B树索引不存储null值的特性,创建一个函数索引.create index x_idx_fun on x(decode(flag,'N','N'))

2、使用绑定变量提高性能
create table tt( x int);
create or replace procedure proc1 as
begin
  for i in 1..10000
    loop
      execute immediate
      'insert into tt values(:x)' using i;
    end loop;
end;


create or replace procedure proc2 as
begin
  for i in 1..10000
    loop
      execute immediate
      'insert into tt values('||i||')' ;
    end loop;
end;


set timing on


PL/SQL procedure successfully completed.


Elapsed: 00:00:00.29
SQL> exec proc2


PL/SQL procedure successfully completed.


Elapsed: 00:00:05.32


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小科

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值