索引能阻塞INSERT,这是我以前怎么也想不到的,那就是位图索引。虽然说如果某列的重复列很多,比如性别,只有男女两种情况,就比较适合用位图索引,但是你要考虑你系统的实际情况,如果系统只是提供查询,那用位图索引确实是个不错的选择。不过只要你的系统有可能存在并发会话进行插入的情况下,那会就要小心了。下面举个例子:
测试环境:window xp+oracle 10.1.0
SQL> CREATE TABLE TEST_BITMAP(X INT PRIMARY KEY,Y VARCHAR2(1));
Table created
SQL> CREATE BITMAP INDEX TEST_INTMAP$IDX ON TEST_BITMAP(Y);
Index created
SQL> INSERT INTO TEST_BITMAP(X) VALUES(1);
1 row inserted
没有提交
然后打开会话2:
SQL> INSERT INTO TEST_BITMAP(X) VALUES(3);
就这样就进入了阻塞状态,不可思议。
查询阻塞情况:
SQL> select '阻塞者('||sb.sid||':'||sb.serial#||'-'||sb.username||')-'||qb.sql_text blockers,
2 '等待者('||sw.sid||':'||sw.serial#||'-'||sw.username||')-'||qw.sql_text waiters
3 from v$lock lb,v$lock lw,v$session sb,v$session sw,v$sql qb,v$sql qw
4 where lb.sid=sb.sid
5 and lw.sid=sw.sid
6 and sb.prev_sql_addr=qb.address
7 and sw.sql_address=qw.address
8 and lb.id1=lw.id1
9 and sb.lockwait is null
10 and sw.lockwait is not null
11 and lb.block=1;
BLOCKERS WAITERS
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
阻塞者(153:90-DBOWN)-begin :id := sys.dbms_transaction.local_transaction_id; end; 等待者(144:42-DBOWN)- INSERT INTO TEST_BITMAP(X) VALUES(3)
所以说只要你的系统存在并发插入的情况就小心用位图索引,要不然就有可能造成严重的后果。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13387766/viewspace-521255/ ,如需转载,请注明出处,否则将追究法律责任。