1、位图索引影响性能
采用位图索引,一个键指向多行,如果更新或插入一个位图索引键,那么这个键所指向的所有记录都会被锁定,从而导致其他会话的等待.
比如有人插入一个新记录.位图索引键值为'N',就会锁定位图索引中的N键,而这会同时锁定另外的所有为N的记录,此时,如果其他人想插入N值或者更新为N值的行,都需要等待.
直到第一个会话提交后,另外两个会话中的一个才会执行完成,然后再提交执行完成的会话,第三个会话才会执行完成.(后面两个会话的执行顺序还不知道是怎样的)
所以,位图索引在这样高并发的情况下不宜使用.那么这样的低基数的字段该怎样建索引呢?
如果这样的低基数只有2,3个值,且数据分布均匀,则不建索引.
如果数据有明显的倾斜,则利用B树索引不存储null值的特性,创建一个函数索引.create index x_idx_fun on x(decode(flag,'N','N'))
2、使用绑定变量提高性能
采用位图索引,一个键指向多行,如果更新或插入一个位图索引键,那么这个键所指向的所有记录都会被锁定,从而导致其他会话的等待.
比如有人插入一个新记录.位图索引键值为'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