6 - 存储空间管理(块空间、段空间管理及压缩)

第六课

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(默认未启用)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值