oracle数据库:开发成功的Oracle应用【笔记3】
1.2黑盒方法(《oracle数据库:开发成功的Oracle应用【笔记2】》http://www.52ij.com/jishu/5128.html)
所以这里的问题在于,由于不了解数据库特性(位图索引)以及这个特性是如何工作的,导致从一开始数据库可扩缩性就很差。更糟糕的是,实际上根本没有必要编写处理队列的代码。数据库已经有内置的队列功能,而且早在Oracle 8.0(于1997年发布)就已经具备这一特性。这个内置的特性允许多个生产者(插入N个未处理记录的会话)并发地将消息放入一个入站队列(inbound queue),并允许多个消费者(查找N个记录来进行处理的会话)并发地接收这些消息。也就是说,根本不需为了在数据库中实现队列而编写任何特殊代码。开发人员应该使用这个内置特性,而且他们可能确实使用了,除非对此一无所知。
相关知识
位图索引
我们目前大量使用的索引一般主要是B*Tree索引,在索引结构中存储着键值和键值的RowID,并且是一一对应的,而位图索引主要针对大量相同值的列而创建(例如:类别,操作员,部门ID,库房ID等),索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码,位置编码中的每一位表示键值对应的数据行的有无。一个位图索引块可能指向的是几十甚至成百上千行数据的位置。这种方式存储数据,相对于B*Tree索引,占用的空间非常小,创建和使用非常快。
位图索引的适用场合
1、位图索引是Oracle数据库在7.3版本中加入的,8i\9i企业版和个人版支持,标准版不支持。
2、基于规则的优化器无法使用Bitmap索引
3、适应于有大量重复值的列查询
4、对于8i,9i版本,不适用于单行插入,适用于批量插入的数据,因为单行插入时,相同键值,每插入8行就会生成一行索引块中的位图段,即使相同的值。而批量插入时,相同键值只生成一个位图段。
5、由于并发DML操作锁定的是整个位图段的大量数据行,所以位图索引主要是用于OLAP应用,也可以用于OLTP中主要为读操作的表。
测试
create table Hhad (ID number(5),NO varchar2(7),HB number(1),ZXR varchar2(4));
create bitmap index btindex on Hhad(ZXR);
sys@ORCL> Declare
Begin
For i In 1..9
Loop
Insert Into H病人挂号记录(ID,NO,HB,ZXR) Values(i,'G000001',1,'张1');
End Loop;
Commit;
End;
/
sys@ORCL> delete Hhad where id=1;
不提交,继续
sys@ORCL> delete Hhad where id=8;
操作可以进行,另开一个会话,
sys@ORCL> delete Hhad where id=9;
操作等待(???与原文中“操作可以进行,没有锁定。”不同)
sys@ORCL>create table tn(a number,b number);
Table created.
sys@ORCL>insert into tn select rownum,mod(rownum,5) from all_objects where rownum < 21
20 rows created.
sys@ORCL>commit;
Commit complete.
sys@ORCL>create bitmap index tn_bitmap on tn(b);
Index created.
sys@ORCL>exec show_space('TN_BITMAP',user,'INDEX');
Free Blocks............................. 0
Total Blocks............................ 8
Total Bytes............................. 65,536
Total MBytes............................ 0
Unused Blocks........................... 6
Unused Bytes............................ 49,152
Last Used Ext FileId.................... 1
Last Used Ext BlockId................... 96,064
Last Used Block......................... 2
PL/SQL procedure successfully completed.
sys@ORCL>select distinct segment_type from dba_segments;
SEGMENT_TYPE
------------------------------------------------------
LOBINDEX
INDEX PARTITION
TABLE SUBPARTITION
TABLE PARTITION
NESTED TABLE
ROLLBACK
LOB PARTITION
LOBSEGMENT
INDEX
TABLE
CLUSTER
TYPE2 UNDO
12 rows selected.
sys@ORCL>select * from tn;
A B
---------- ----------
1 1
2 2
3 3
4 4
5 0
6 1
7 2
8 3
9 4
10 0
11 1
12 2
13 3
14 4
15 0
16 1
17 2
18 3
19 4
20 0
20 rows selected.
sys@ORCL>alter system dump datafile 3 block 1955;
System altered.
(???Block header dump无)
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5129.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
