第六课
6.1 存储空间管理
块空间管理:
PCTFREE=10
注:大对象(LOB) 数据类型(BLOB、CLOB、NCLOB 和BFILE)不使用PCTFREE 存储参数。非压缩块和OLTP 压缩块的默认PCTFREE 值为10;基本压缩块的默认PCTFREE值为0。
select * from dba_segments where owner=‘OUZY’
行链接和行迁移:
行链接:insert时,行太大,一行数据无法在一个block存储。
行迁移:update时,块的剩余空间无法存储一行数据,这时候整行搬迁,rowed不变。
行链接和行迁移都会造成I/O性能下降。
行链接和行迁移
analyze table test compute statistics;
select avg_row_len,chain_cnt from user_tables where table_name=‘TEST’;
行迁移是将数据存放到另外一个块,而行链接是数据同时位于多个数据块。
alter table test move; 消除行迁移,但索引失效
update引起行迁移
insert引起行链接
行链接和行迁移检测:
--行链接实验
SQL >@?/rdbms/admin/utlchain.sql
create table tbs01(
c1 varchar2(4000),
c2 varchar2(4000),
c3 varchar2(1000));
insert into tbs01(c1,c2,c3) values(LPAD('a', 4000, '*'),LPAD('a', 4000, '*'),LPAD('a', 1000, '*'));
insert into tbs01 select * from tbs01;(多次执行)
commit;
analyze table tbs01 compute statistics;(分析tbs01表)
select avg_row_len,chain_cnt from user_tables where table_name='TBS01';
select avg_row_len,chain_cnt from dba_tables where table_name='TBS01';
analyze table tbs01 list chained rows into chained_rows;
--行迁移
create table tbs02(
c1 varchar2(100),
c2 varchar2(100),
c3 varchar2(100));
insert into tbs02(c1,c2,c3) values('a','b','c');
insert into tbs02 select * from tbs02;
update tbs02 set c1=LPAD('a', 20, '*'),c2=LPAD('a', 20, '*'),c3=LPAD('a', 20, '*');
analyze table tbs02 compute statistics;
行链接:insert 行太大无法避免,除非加大block
行迁移:update
exp->imp、表重组,可消除行迁移,或者insert select * from
段内空闲空间管理:
此层次的最大层数为3。
本地管理表空间(LMT)与自动段空间管理(ASSM)
一级位图块、二级位图块、三级位图块。(oracle 位图level)
段类型:
表和簇段
索引段
还原段
临时段
段由Oracle server动态分配。
分配区:
分配段:
deferred_segment_creation(段延迟)
user_segments
create table seg_tbs1(c1 number, c2 number) segment creation immediate;(创建一个表,立即分配段)
create table seg_tab2(c1 number, c2 number) segment creation deferred;(创建一个表,延迟)
alter session set deferred_segment_creation = true;
alter system set deferred_segment_creation = false;(关闭段延迟)
没有段的索引:
create index idx_id on tbs01(c1) unusable;
alter index idx_id unusable;
alter index idx_id rebuild;(会锁表)
alter index idx_id rebuild online;(online可避免锁表)
表压缩:
基本压缩适用于直接路径插入操作
OLTP压缩(advanced)适用于所有DML操作
Oracle DB 支持以下三种表压缩方法:
• 基本表压缩
• OLTP 表压缩
• Hybrid Columnar 压缩(Exadata)
基本压缩:在使用直接加载或CREATE TABLE AS SELECT 等操作执行批量加载时压缩数据。
create table tbasic(c1 varchar2(100)) compress basic;
Oracle DB 在执行下列直接路径插入操作期间尝试压缩数据:
- 直接路径SQL*Loader
- CREATE TABLE AS SELECT 语句
- 并行INSERT 语句
- 带有APPEND 提示的INSERT 语句 /**+*/
imp不支持直接路径insert。
采用COMPRESS 或COMPRESS BASIC 的表使用PCTFREE 值0 以最大化压缩,除非显式设置PCTFREE 子句的值。
采用row store compress advanced 或NOCOMPRESS 的表使用PCTFREE 的默认值10 以最大化压缩,同时仍允许以后对数据进行一些DML 更改,除非显式覆盖该默认值。
适用于DML操作的OLTP压缩:
create table tdml(id int) row store compress advanced;
指定表压缩:
压缩计算:
语句压缩估算:
declare
blkcnt_comp pls_integer;
blkcnt_uncmp pls_integer;
row_comp pls_integer;
row_uncmp pls_integer;
comp_ratio number;
comp_type varchar2(30);
username varchar2(30) := '&USER'; --用户名
tablename varchar2(30) := '&TB'; --表名
begin
dbms_compression.get_compression_ratio('&Usedtbs' --变空间名
,username
,tablename
,null
,dbms_compression.comp_advanced
,blkcnt_comp
,blkcnt_uncmp
,row_comp
,row_uncmp
,comp_ratio
,comp_type);
dbms_output.put_line('Sampling table: ' || username || '.' || tablename);
dbms_output.put_line('Estimated compression ratio: ' ||to_char(comp_ratio));
dbms_output.put_line('Compression Type: ' || comp_type);
dbms_output.put_line('Compression ratio ='||blkcnt_uncmp/blkcnt_comp||' to 1');
dbms_output.put_line('Row count per block compressed = ' ||row_comp);
dbms_output.put_line('Blk count compressed = ' || blkcnt_comp);
dbms_output.put_line('Blk count uncompressed = ' || blkcnt_uncmp);
end;
表空间监视:
select * from dba_outstanding_alerts;
收缩段:
delete 不降高水位线----undo----redo很多
truncate 降高水位线–很少redo–不能闪回
alter table tbs02 enable row movement; (打开行移动特性)
alter table tbs02 shrink space compact; 只整理碎片 不回收空间
alter table tbs02 shrink space; 整理碎片并回收空间
alter table tbs02 shrink space cascade;
alter table tbs02 disable row movement;(关闭行移动特性)
段指导:
自动段指导:
手动收缩段:
前面通过段指导可以产生建议。
也可以手动执行段收缩。
管理可恢复的空间分配
可以在系统或会话级启用可恢复的语句功能。
挂起语句时将自动挂起事务处理。
(默认2 小时)后将重新激活自身,并向用户返回异常错误。
alter session enable resumable;
insert into sales_new select * from sh.sales;
alter session disable resumable;
alter session enable resumable timeout 3600;
select * from user_resumable; select * from dba_resumable;(查看sql执行情况)
select * from v$session_wait;
参数: resumable_timeout(默认未启用)