数据库表笔记

|||数据库表
|数据库表的类型——堆组织表/heap organized table
| 索引组织表/index organized table
| 索引聚簇表/index clustered table
| 散列聚簇表/hash clustered table
| 有序散列聚簇表/sorted hash clusterd table
| 嵌套表/nested table
| 临时表/temporary table
| 对象表/object table
| 外部表/external table

|||段空间管理
|——手动段空间管理(manual segment space management,MSSM)
| 空间管理参数需要设置FREELISTS、FREELIST GROUPS、PCRFREE、PCTUSED等参数
|
|——自动段空间管理(automatic segment space management,ASSM)
| 空间管理参数只需要设置PCTFREE即可,其他参数会自动忽略
| INITRANS,同一块上初始的并发事务数
| MAXTRANS,9i使用,10g以后默认为255,10g以后可忽略
| BUFFER_POOL
| 段空间管理继承自表空间管理,所以ASSM的段必须要放在支持ASSM的表空间中

|||高水位线
|——HWM首先在新建表的第一个块中,随着表中放入数据,使用越多的块后,HWM会升高;当删除其中的某些行时,可能会有很多块不含数据,
| 但是这些块仍旧在HWM之下,直到对象被从建或者收缩。
|
|——Oracle在全面扫描段时会扫描HWM之下的所有块,即使其中不包含任何数据,这样就会影响全面扫描的性能。
|——MSSM中,WHM推进时,所有块都会格式化并立即有效;ASSM中,HWM推进时,并不会立即格式化所有块,只在第一次使用块时完成格式化。
|——ASSM中有一个低HWM,低HWM之下的块都被格式化;在插入数据时,新数据会插入到低HWM和高HWM之间,因此低与高HWM之间的许多块没有
| 被格式化。因此在进行全面扫描的时候,为了减少对每个块是否“安全”或是否未格式化的检查,oracle直接会读取并处理低HWM之下的
| 块,而对低、高HWM之间的块进行一种更安全的检查措施,需要查看其所用的ASSM位图信息来判断应该读取或忽略哪些块。

|||FREELIST
|——使用MSSM表空间时,oracle会在FREELIST中为有自由空间的对象维护其HWM以下的块。
|——只有HWM之下的块才能出现在FREELIST中,当FREELIST为空时,oracle会推进HWM,并把这些新增的块放入FREELIST中,也就是说,oracle
| 会延迟到不得已时才增加对象的HWM。
|——一个对象可以有1至多个FREELIST,可以根据需要把块放在FREELIST上或者从FREELIST删除。合理的FREELIST数对性能优化有极大好处。
| 当然不是越大越好,多个FREELIST是由一个主FREELIST管理其他的FREELIST,每个FREELIST进程只管理自身FREELIST,可能出现一个FREE
| LIST进程的块列表空了,而其他FREELIST进程没空,但此时会导致空了的进程访问主FREELIST进程,如果主FREELIST进程中的块列表也
| 空的情况下会申请推进HWM,过多的此种现象会导致表不必要的占用稍多磁盘空间。大规模导入数据的时候可以增大FREELIST数,操作完
| 后再修改为合适的数目,比如:5
|——ASSM表空间管理无FREELIST概念。

|||PCTFREE和PCTUSED
|——PCTFREE是一个“自由空间”阀值,默认:10%。表示块最少要保留至少PCTFREE的空间以供以后update。
|——PCTUSED是一个“非自由空间”阀值,默认:40%。表示块中的数据减少到PCTUSED后才可以继续insert。
|——简单理解为数据块里的数据增加到100%-pctfree的容量时就停止insert但可以update,等到块中的数据减少到pctused的容量时才可以继
| 续insert。
|——PCTFREE对MSSM和ASSM都有意义,PCTUSED只对MSSM有意义。同样是ASSM或者MSSM,PCTFREE在不同的表类型中有所差别,比如:IOT。
|——PCTFREE设计的太大会浪费磁盘空间,设计的太小可能会出现行迁移和行串联
|——行迁移:指某一行从最初插入的块上移动另外的某个块上,并且会在原来块上保留一个转发地址,指向新的块,原因是可能有索引物理
| 的指向原块地址。此问题出现过多会影响系统性能。



|||索引组织表(IOT)
| 是存储在索引结构中的表,按主键顺序存储和排序。IOT不存在主键的空间开销,索引就是数据,数据就是索引。
| 比较适合按主键进行访问,并且能保证数据按主键以某种特定的顺序进行物理存储,以select为主的表。
| 如果有较多更新、插入则不太适合IOT类型的表。
| 建表语句:
create table iot_table(
ID varchar2 ( 10 ),
NAME varchar2 ( 20 ),
constraint pk_id primary key ( ID,NAME )
)
organization index --定义为索引组织表
overflow --指定设置“行溢出”
PCTTHRESHOLD 20 --每一行数据最多占用索引块的20%,超出20%的则放入溢出段
INCLUDING name --指定列之前的列(包括指定列)都放入索引块,之后的列都放到溢出段
tablespace iot_tablespace;

| 查看表的DDL语句:
select dbms_metadata.get_ddl('TABLE','table_name') from dual;

| nocompress, compress 1, compress 2 压缩选项:
analyze index idx_name validate structure; -- 分析索引并填写一个名为index_stats的动态性能视图
select lf_blks,br_blks,used_space,opt_cmpr_count,opt_cmpr_pctsave from index_stats;
alter table iot_table move compress 1; --根据opt_cmpr_count为1或者2得到“最优压缩数”
alter table iot_table move compress 2;



|||索引聚簇表
一般为有一组表,有一些共同的列,将这些表存储在相同的数据块中,或者将相关的数据存储在同一个块上,这种类型的表就是聚簇表。
聚簇并不有序的存储数据(IOT如此),它是按某个键以聚簇方式存储数据,但数据存储在堆中。

1、创建聚簇
create cluster emp_dept_cluster
(deptno number(2)) --聚簇键
size 1024;
size--指每个聚簇键最多关联1024字节的数据,也就是控制每块上聚簇键的最大个数,设置小了容易引起块串连,大了容易浪费空间。此参数是聚簇最重要的参数。

2、创建聚簇索引
create index emp_dept_cluster_idx
on cluster emp_dept_cluster;

3、创建聚簇表
create table dept
(deptno number(2) primary key,
dname varchar2(14),
loc varchar2(14)
)
cluster emp_dept_cluster(deptno);

create table emp
(empno number primary key,
ename varchar2(10),
job varchar2(10),
deptno number(2) reference dept(deptno) --需要在此字段上创建索引
)
cluster emp_dept_cluster(deptno);

4、不适合用聚簇的地方
4.1 大量修改操作
4.2 全表扫描多
4.3 需要进行表分区(cluster table不能进行表分区)
4.4 需要频繁truncate和加载表

5、如果总是读并且通过索引来读,还要通过索引将几个表连接在一起。也就是在逻辑上相关且总在一起使用的表,可以合适为聚簇表。



|||散列聚簇表
与索引聚簇表很相似,只是聚簇键索引被一个散列函数所取代。表中的数据就是索引。
oracle会取得一行的键值,使用某个内部或自定义的散列函数进行散列计算,然后根据散列值得出数据在磁盘的哪个位置。
散列算法只能通过确定的值来使用,这就说明如果通过范围、区间扫描字段则需要在其字段上增加传统索引。
一开始就要分配空间——HASHKEYS/truncate(blocksize/SIZE) 个块空间,并完成格式化。
HASHKEYS固定,除非重建聚簇,此参数值只影响散列键数,不影响表记录数,但是太低会影响性能能。

1、创建散列聚簇
create cluster hash_cluster
(hash_key number) --散列聚簇键
hashkeys 9000 --散列键值数,实际上为最接近hashkeys的一个质数。
size 1024 --每个键值关联的数据大小
tablespace assm
/

2、创建表
create table hashed_table
( x number, data1 varchar2(500), data2(500))
cluster hash_cluster(x);

3、建索引
alter table hashed_table add constraint t_hashed_pk primary key(x);

4、分析表
begin
dbms_stats.gather_table_stats( sms, 'HASHED_TABLE' );
end;
/

5、对散列聚簇表索引来说查询时一个CPU密集型的工作,对传统的索引来说是I/O密集型的工作。随着数据增加散列聚簇查询可以更好扩展。

6、单表散列聚簇: 一次只支持聚簇中的一个表。
create cluster hash_cluster
(hash_key number) --散列聚簇键
hashkeys 9000 --散列键值数,实际上为最接近hashkeys的一个质数。
size 1024 --每个键值关联的数据大小
single table
hash is HASH_KEY
/

7、适用范围
7.1 清楚有多少行记录
7.2 与select操作相比,dml操作很轻。
7.3 经常通过hashkey访问数据。



|||有序散列聚簇表
为10g新增,结合了散列聚簇和IOT的特性,经常按某键获取数据,但要求按另外某列排序的情况下可以采用此种表。

1、创建聚簇
create cluster shc
(
cust_id number,
order_dt timestamp sort
)
hashkeys 10000
hash is cust_id
size 1024
/

2、创建表
create table cust_orders
( cust_id number,
order_dt timestamp sort,
......
......
)
cluseter shc(cust_id,order_dt)
/

3、除具足散列聚簇表的限制之外,还需要一个约束,即尽可保证数据按键值的有序顺序到达。



 

你可能感兴趣的:(职场,休闲,数据库表)