维护表

来源:互联网 发布:mac 个人文件夹改名 编辑:程序博客网 时间:2024/05/02 01:16

表的类型
普通表(heap(堆)表)
分区表(大数据表)
索引组织表(索引与表结合)
集群表(关系紧密的表集合)

内建数据类型
CHAR、VARCHAR2、NUMBER、DATE、TIMESTAMP、BLOB、CLOB

表的列数小于1000列,超过254列时会分成row pieces存储
表的行数无限制

rowid为行标识,可定位记录,18位,段ID(6)+数据文件ID(3)+块ID(6)+行ID(3)通过bytes64型转换成a-z、A-Z组成的编码。

ROW的结构
3个部分:
row header、column length(250个字节用1个字节表示长度,超过250个字节用3个字节表示长度)、column value。

create table t
(id int, name char(10))
storage(initial 128K next 128K pctincrease 0 minextents 1 maxextents unlimited)
tablespace xxx initrans 4 pctfree 25;
说明:
initial为第一个extent大小即刚开始segment的大小,next为空间不足时下一个extent大小,pctincrease为第二个之后extent尺寸增涨的百分比,minextents最小的extent数)

initrans: 同时操作块的transaction个数.

临时表:用于放中间结果,生命周期为session或transaction。
放置在用户所属的临时表空间内
创建临时表空间不分配空间,只有在插入数据的时候才分配。
产生的redo信息少,但是undo会产生redo;

session级别有效
create global temporary table tmp_session on commit preserve rows(commit之后保存行)
as select * from xxx where 1=0;拷贝表xxx结构,不拷贝记录;

transaction级别有效
create global temporary table tmp_session on commit delete rows(commit之后删除行)
as select * from xxx where 1=0;拷贝表xxx结构,不拷贝记录;

设置pctfree=(平均记录大小-初始记录大小)*100/平均记录大小
设置pctused=平均记录大小*100/可用数据空间

ROW Migration(记录迁移)
因为pctfree设置太小时,一个记录因为修改导致变大了,没有足够的空间存放时,就只能从这个块迁移到新块,会在原来的块留一个指针,指向新块地址。ROW Migration(记录迁移)导致I/O性能下降,因为它要扫描2个块去取数据。
解决方法:pctfree增大。

ROW chaining(记录链)
当一个记录太大时(列太多或列太长),任务一个block都放不下时,oracle会把该记录分成不同的row pieces,每个row pieces都会包含必需的指针帮助oracle读取每部分并且组装成完整的记录。
解决方法:增加block大小或者分割table成不同的tables。

手动分配extent
alter table xxx
allocate extent(size 500k
datafile 'xxxxxxx.dbf'
);

普通表的重新组织(内容清空,结构保存;但是实践证明内容没被清空)
alter table xxx
move tablespace xxx1;

查看表结构(显示创建table语句)
select dbms_metadata.get_ddl('TABLE','GG') from dual;

truncate清空表(不产生undo数据,不会执行触发器)
truncate table xxx;
保留minextent指定的个数;NEXT为最后一个truncate掉的extent大小;

删除表
drop table xxx
cascade xxx;

删除列
alter table xxx
drop column
cascade xxx(约束条件) checkpoint 1000(当删除列的表很大时,undo信息很大导致undo segment涨满,所以允许在删除1000行时进行一次checkpoint)

对列设置UNUSED标签(对用户不可见)
alter table xxx set unused column xx cascade xxxx;
删除unused列
alter table xxx
drop unused column checkpoint 1000;
删除过程中中断时
alter table xxx
drop column continue checkpoint 1000;

重命名列
alter table xxx  rename column xxx to xxx1;

获取表信息
dba_tables;
dba_objects;
select object_name,object_type from dba_objects where object_type='TABLE';