索引
索引的种类:
B*Tree索引:是最常用的,其结构与二叉树比较类似,根据Rowid快速定位所访问的行,适合唯一值比较多的列。
语法: create index idx_name on tablename(column_name);
BitMap索引:适合唯一值比较少的列,比如:性别(男/女)等,位图以一种压缩格式存放,因此占用的磁盘空间比B-Tree索引要小得多。对于那些少于1000个唯一数据值的数据列建立位图索引,可以使执行效率更快。适合集中读取,不适合频繁插入和修改操作的表,多用于静态表和OLAP系统。
语法: create bitmap index idx_name on tablename(column_name);
函数索引:这种索引中保存了数据列基于function返回的值,在select * from table where function(column)=value这种类型的语句中起作用。
语法:create index idx_name on tablename(functionname(column_name));
索引的扫描方式:
Index unique scan:经常发生在主键或者唯一索引上,当找到适合数据后就不会进行继续扫描(因为是主键和唯一索引),所以扫描速率是最高的。
Index range scan:一般发生在返回多个值的时候,比如where条件id>value and id <value,或者从非唯一索引中id=value时。此扫描要求返回结果集不能太大,否则索引不能生效,结果集一般不超过表中数据量的5%-10%。
Index full scan:此方式oracle会按照索引值的顺序全部扫描索引,效率不高。
语句:select charge_id from a_pay_flow order by charge_id
Index fast full scan:与Index full scan不同,它不是按照索引值顺序进行访问的,而是直接读取物理索引数据,效率高。full scan这两种方式会在这次查询中所用到的列都在索引中存在情况下出现。
语句:select count(1) from a_pay_flow
分区表
分区表:就是把非常大的表分割成较小的分区,在实际应用中在独立分区上操作各个部分,而对用户透明。
优点:
增强可用性:如果表的某个分区出现故障,表在其它分区的数据仍然可用;可用性的提高源自于每个分区的独立性。
维护方便,减轻管理负担:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
均衡I/O,减少资源竞争:可以把不同的分区映射到不同磁盘以平衡I/O,改善整个系统性能;
改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
类型(10g):
Range(范围)分区:应用范围比较广的表分区方式,它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的range分区中,因此在创建的时候呢,需要你指定基于的列,以及分区的范围值,如果某些记录暂无法预测范围,可以创建maxvalue分区,所有不在指定范围内的记录都会被存储到maxvalue所在分区中。
Hash(哈希)分区:对于那些无法有效划分范围的表, hash分区会将表中的数据平均分配到你指定的几个分区中,列所在分区是依据分区列的hash值自动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中。
List(列表)分区:该分区与range分区类似,也需要指定列的值,但又不同与range分区的范围式列值(其分区值必须明确指定),也不同与hash分区(通过明确指定分区值,能控制记录存储在哪个分区)。
组合分区(Range-Hash,Range-List):要注意顺序,根分区只能是range分区,子分区可以是hash分区或list分区。
公共准则:如果选择的分区不能确保各分区内记录量的基本平均,则这种分区方式有可能是不恰当的。 Range-List
CREATE TABLE A_PAY_FLOW
(
CHARGE_ID NUMBER(16) NOT NULL,
CASHCHK_ID NUMBER(16),
ACCT_ID NUMBER(16),
CONS_NO VARCHAR2(16 BYTE),
ORG_NO VARCHAR2(16 BYTE),
CHARGE_YM VARCHAR2(6 BYTE)
......
)
PARTITION BY RANGE (ORG_NO)
SUBPARTITION BY LIST (CHARGE_YM)
......
(
PARTITION A01 VALUES LESS THAN ('23402')
......
( SUBPARTITION A01_0801 VALUES ('200801') TABLESPACE EPMRANGE1,
SUBPARTITION A01_0802 VALUES ('200802') TABLESPACE EPMRANGE1,
SUBPARTITION A01_0803 VALUES ('200803') TABLESPACE EPMRANGE1
......
SUBPARTITION A01_OTHER VALUES (default) TABLESPACE EPMRANGE1)
分区表与普通表的性能对比
分区表:select count(1) from a_pay_flow a where a.org_no = '2340201' and a.charge_ym = '200809';
普通表:select count(1) from a_pay_flow_bak a where a.org_no = '2340201' and a.charge_ym = '200809';
分区表的索引:
全局索引(global index):建立在table上, 与分区是一对多的关系。
本地索引(local index):建立在每个分区上, 与分区是一对一的关系。
要保证所有分区中的数据记录的唯一性时采用全局索引,其它情况下采用本地索引。
批量数据处理
在对大表进行删除、更新操作时,要采用批量数据提交的方式。不仅要考虑对undo(回滚段)的影响,还要考虑对redo(归档日志)、对磁盘i/o、阻塞等的影响。例如,在千万条记录的表中删除上百万条数据。
批量删除示例
cnt number(10);
i number(10);
begin
select count(1) into cnt from a_pay_flow_bak where org_no='2340203' and charge_ym='200801';
for i in 1..trunc(cnt/1000)+1 loop
delete from a_pay_flow_bak where org_no='2340203' and rownum<=1000;
commit;
end loop;
end;
总结
大数据量的处理:分区表、哈希连接、批量数据处理。
小数据量的处理:索引、嵌套循环连接、绑定变量。
Labels parameters