ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 用位图索引小心

用位图索引小心

原创 Linux操作系统 作者:qgw521 时间:2008-12-25 20:17:10 0 删除 编辑

索引能阻塞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博客 ” ,链接:http://blog.itpub.net/13387766/viewspace-521255/,如需转载,请注明出处,否则将追究法律责任。

上一篇: Union all 与 or
请登录后发表评论 登录
全部评论

注册时间:2008-06-06

  • 博文量
    128
  • 访问量
    278387