逻辑存储结构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
逻辑存储结构
存储结构
官⽅⽂档⼊⼝:
Database Concepts ---> 12 Logical Storage Structures
1 TABLESPACE(表空间)
1.1 定义
表空间是⼀个逻辑概念,物理上对应⼀个或多个数据⽂件datafile或临时⽂件tempfiles,逻辑上表空间是存储段的容器。
(段也是逻辑概念,是数据库中的对象如表、索引等)
1.2 类型和管理⽅式
表空间类型:
①PERMANENT 永久表空间
②UNDO 撤销表空间
③TEMPORARY 临时表空间
管理⽅式重点是段的管理⽅式和区的管理⽅式是在建⽴表空间时确定的
段管理⽅式有AUTO和MANUAL两种,区管理⽅式有本地管理和字典管理(已淘汰)两种
1.2.1 查看表空间类型、段和区管理⽅式
select tablespace_name,contents,segment_space_management,extent_management from dba_tablespaces;
select*from v$tablespace;
数据⽂件)⼤⼩、是否⾃动扩展
⼤⼩、是否⾃动扩展
1.2.2 查看表空间
查看表空间((数据⽂件)
col file_name for a45
col tablespace_name for a10
select file_id,file_name,tablespace_name,bytes/1024/1024 M,status,AUTOEXTENSIBLE from dba_data_files order by1;
1.2.3 查看表空间⼤⼩
⼀个表空间可能对应多个数据⽂件
select TABLESPACE_NAME,sum(bytes)/1024/1024 M from dba_data_files group by tablespace_name;
1.2.4 查看表空间空闲⼤⼩
select tablespace_name,sum(bytes)/1024/1024 M from dba_free_space group by tablespace_name;
1.2.5 可在OEM中查看表空间情况
1.3 基本操作
1.3.1 small表空间扩展
表空间的⼤⼩等同它所有的数据⽂件⼤⼩之和,默认使⽤small表空间当发⽣表空间不⾜的问题时常⽤的3个解决办法:
增加原有数据⽂件⼤⼩(resize)
增加⼀个数据⽂件(add datafile)
设置表空间⾃动增长(autoextend)
1.3.1.1 创建small表空间
create tablespace orcl datafile '/u01/app/oracle/oradata/ORCL/prod01.dbf' size 5m;
create table scott.test1 (id number) tablespace orcl;
insert into scott.test1 select empno from scott.emp;
insert into scott.test1 select*from scott.test1;
报错:空间不⾜
1.3.1.2 resize扩充表空间【第⼀种⽅法】
select file_id,file_name,tablespace_name from dba_data_files;
alter database datafile 2 resize 10m;
insert into scott.test1 select*from scott.test1;
继续添加数据,报错
使⽤第⼆种⽅法扩充表空间
1.3.1.3 add datafile扩充表空间【第⼆种⽅法】
alter tablespace prod add datafile '/u01/app/oracle/oradata/PROD/prod02.dbf' size 20m;
insert into scott.test1 select*from scott.test1;
继续添加数据,报错
使⽤第三种⽅法扩充表空间
1.3.1.4 autoextend on扩充表空间【第三种⽅法】
alter database datafile 2 autoextend on next 10m maxsize 500m;
select FILE_ID,TABLESPACE_NAME,BYTES/1024/1024 Tsize,AUTOEXTENSIBLE,MAXBYTES/1024/1024 Tmax from dba_data_files;
drop tablespace orcl including contents and datafiles;
1.3.1.5 数据⽂件移动或改名
可以将⼀个在线数据⽂件从⼀种存储系统移动或改名到另⼀个存储系统
当⼀个数据⽂件正在进⾏移动的时候,可以执⾏查询,DML,DDL操作,包括如下:查询语句,创建表和索引,重建索引
注:被移动的数据⽂件的对象是压缩状态时,压缩状态不变
在移动数据⽂件到另⼀个位置或存储系统时,我们不⼀定要关闭数据库或者将数据⽂件置为离线状态
TO从句只有当是OMF管理时才可以省略通过DB_CREATE_FILE_DEST 参数来设置最新的位置。
如果REUSE选项被指定,已存在的⽂件会被覆盖。
如果KEEP 语句指定,旧的⽂件会在移动过程中保留,但是OMF管理的⽂件不⽀待keep
可以使⽤V$SESSION_LONGOPS视图来显⽰正在执⾏的移动操作,移动操作的状态有三种:NORMAL、COPYING、SUCCESS最后⼜回到NORMAL状态1.3.2 建⽴⼤⽂件(bigfile)的表空间
smallfile,在⼀个表空间可以建⽴多个数据⽂件(默认),不⽀持 32G 以上
bigfile:在⼀个表空间只能建⽴⼀个数据⽂件(8k 的 block 时,最⼤可达 32T),简化对数据⽂件管理
create tablespace test datafile '/u01/app/oracle/oradata/ORCL/test01.dbf' size 32G;
超出⼩⽂件的最⼤块数,创建bigfile
create bigfile tablespace big_tbs datafile '/u01/app/oracle/oradata/ORCL/bigtbs01.dbf' size 100m;
在bigfile表空间下增加⼀个数据⽂件会报错
alter tablespace big_tbs add datafile '/u01/app/oracle/oradata/ORCL/bigtbs02.dbf' size 100m;
查看⼤⽂件表空间
select name,bigfile from v$tablespace;
1.3.3 建表空间缺省选项dbms_metadata.get_ddl
create tablespace a datafile '/u01/app/oracle/oradata/ORCL/a01.dbf' size 10M;
利⽤oracle提供的dbms_metadata.get_ddl包看看缺省值都给的是什么
set serveroutput on
declare
v_sql varchar2(2000);
begin
select dbms_metadata.get_ddl('TABLESPACE','A') into v_sql FROM
dual;
dbms_output.put_line(v_sql);
end;
/
CREATE TABLESPACE "A" DATAFILE '/u01/app/oracle/oradata/ORCL/a01.dbf' SIZE 10485760
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT 区本地管理且⾃动分配空间
NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO 段⾃动管理
dbms_metadata.get_ddl也可以查看表,将('TABLE','EMP','SCOTT')替换('TABLESPACE','A')即可
create tablespace b datafile '/u01/app/oracle/oradata/ORCL/b01.dbf' size 10m
extent management local uniform size 128k
segment space management manual;
同上,调dbms_metadata.get_ddl包看Oracle对该语句的ddl操作
declare
v_sql varchar2(2000);
begin
select dbms_metadata.get_ddl('TABLESPACE','B') into v_sql FROM
dual;
dbms_output.put_line(v_sql);
end;
/
CREATE TABLESPACE "B" DATAFILE '/u01/app/oracle/oradata/ORCL/b01.dbf' SIZE 10485760
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 131072 DEFAULT
NOCOMPRESS SEGMENT SPACE MANAGEMENT MANUAL
区本地管理且统⼀分配128K,段空间⼿动管理
如果在建表时使⽤缺省说明,则该表将服从其表空间的这些定义
1.3.4 删除表空间
表空间的删除和offline
drop tablespace B including contents and datafiles;
contents包括控制⽂件和数据字典信息,datafiles是物理数据⽂件
数据库OPEN下不能删除的表空间是:
system
active undo tablespace
default temporary tablespace
default tablespace
数据库OPEN下不能offine的表空间是
system
active undo tablespace
default temporary tablespace
1.3.5 查看默认表空间、默认临时表空间
col PROPERTY_NAME for a30
col PROPERTY_VALUE for a60
select PROPERTY_NAME,PROPERTY_VALUE from database_properties where property_name like'DEFAULT%';
1.3.6 临时表空间
1.3.6.1 ⽤途
⽤于缓存排序的数据(中间结果)
可以建⽴多个临时表空间,但默认的临时表空间只能有⼀个且不能offline和drop
temp表空间是nologing的(不记⽇志)
select file_id,file_name,tablespace_name,bytes/1024/1024 M,status,AUTOEXTENSIBLE from dba_temp_files;
col name for a60
select file#,name,bytes/1024/1024 M from v$tempfile;
select TABLESPACE_NAME,TABLESPACE_SIZE/1024/1024,ALLOCATED_SPACE/1024/1024,FREE_SPACE/1024/1024from dba_temp_free_space;
1.3.6.2 基本操作
1.3.6.
2.1 建⽴临时表空间temp2,增加或删除tempfile
create temporary tablespace temp2 tempfile '/u01/app/oracle/oradata/ORCL/temp02.dbf' size 10m;
alter tablespace temp2 add tempfile '/u01/app/oracle/oradata/ORCL/temp03.dbf' size 5m;
select file_id,file_name,tablespace_name from dba_temp_files;
1.3.6.
2.2 删除临时表空间temp2⾥⼀个tempfile
alter tablespace temp2 drop tempfile '/u01/app/oracle/oradata/ORCL/temp03.dbf';
select file_id,file_name,tablespace_name from dba_temp_files;
1.3.6.
2.3 查看默认的临时表空间
select PROPERTY_NAME,PROPERTY_VALUE from database_properties where property_name like'DEFAULT%';
1.3.6.
2.4 切换数据库默认临时表空间
alter database default temporary tablespace temp2;
1.3.6.
2.5 指定⽤户使⽤临时表空间
alter user scott temporary tablespace temp2;
注意:某个tempfile坏掉使得default temporary tablespace不能正常⼯作,数据库不会crash,解决的办法是add⼀个新的tempfile,然后再drop掉坏的
tempfile(default temporary tablespace不能offline,但temporary file可以offline)
1.4 OMF
Oracle Managed Files Oracle管理⽂件,数据库内部使⽤标准⽂件系统接⼝来创建,删除⽂件,可以针对以下数据库⽂件管理:
Tablespaces
Redo log files
Control files
Archived logs
Block change tracking files
Flashback logs
RMAN backups
⼀个数据库可能有OMF和⾮OMF的⽂件。
⽂件所在的操作系统⽬录是需要预先存在的,Oracle不会创建。
例如设置了DB_CREATE_FILE_DEST,DATAFILE在CREATETABLESPACE语句中,会将数据⽂件⾃动放到上⾯参数设定的⽬录
注:默认ASM使⽤OMF管理⽂件,但是如果我们指定了另外的名称,那么不会受OMF管理
2 SEGMENT(段)
2.1 段的类型和特点
段是逻辑概念,对应数据库中的对象
表空间在逻辑上可以对应多个段,物理上可以对应多个数据⽂件,⼀个段⽐较⼤时可以跨多个数据⽂件(表可以跨数据⽂件)
创建⼀个表,ORACLE为表创建⼀个(或多个)段,在⼀个段中保存该表的所有表数据(表数据不能跨段)
通常段中⾄少有⼀个初始区。
当这个段数据增加使得区(extent)不够时,将为这个段分配新的后续区(11g段空间延时分配)
段的类型:表段、索引段、undo段、临时段
2.2 表和段的关系
⼀般来讲,⼀个单纯的表就分配⼀个段,但往往表没那么单纯,⽐如表上经常会有主键约束,那么就会有索引,索引有索引段,还有分区表,每个分区会有独⽴的段,再有就是Oracle的⼤对象,如果你的表⾥引⽤blob、clob、那么这个表就⼜被分出多个段来
select segment_name,segment_type from dba_segments where owner='SCOTT';
2.3 延迟段:段空间延迟分配
顾名思义,延迟段就是创建表的时候并不马上建⽴相应的段
Oracle11gR2⼜增加了⼀个新的初始化参数DEFERRED_SEGMENT_CREATION(仅适⽤未分区的heap table),此参数默认TRUE,当create table后并不马上分配segment,仅当第⼀个insert语句后才开始分配segment。
这对于应⽤程序的部署可能有些好处
也可以使局部设置改变这⼀功能(覆盖DEFERRED_SEGMENT_CREATION=TRUE),在 create table语句时加上segment creation immediate⼦句指定
show parameter deferred
2.3.1 创建实验⽤户demo
grant connect,resource to demo identified by demo;
conn demo/demo
select*from user_segments;
2.3.2 创建表、查看段分配
create table t1 (id number);
select*from user_segments;
2.3.3 插⼊数据、查看段分配
insert into t1 values(100);
select segment_name,SEGMENT_TYPE,bytes/1024 K,TABLESPACE_NAME from user_segments;
2.4 segment creation immediate
修改为创建表时指定⽴刻分配段
create table t2 (id number) segment creation immediate;
select segment_name,SEGMENT_TYPE,bytes/1024 K,TABLESPACE_NAME from user_segments;
2.5 unusable索引
在oracle中使⽤了额外的特性来节省空间。
所有的UNUSABLE index和index partition都不创建segments。
例如:如果有⼀个DEMO表,有三个分区和分别⼀个本地索引,当执⾏查询的时候,会看到三个表和三个索引段
如果将⼀个分区移动到⼀个新表空间,会看到三个表段和两个索引段因为unusable的索引段会⾃动删除
2.6 ⼀表对应多段
2.6.1 关闭延迟段
alter system set deferred_segment_creation=false;
show parameter deferred
2.6.2 创建带有主键约束、lob列的表
create table t3(id number constraint pk_t3 primary key,name clob);
col segment_name for a30
select segment_name,SEGMENT_TYPE,bytes/1024 K,TABLESPACE_NAME from user_segments;
2.6.3 开启延迟段
alter system set deferred_segment_creation=true;
show parameter deferred
2.7 dba_segments和dba_tables
dba_segments从空间分配⾓度来看,显⽰分配了多少
dba_tables从空间使⽤⾓度来看,显⽰使⽤了多少,需要分析表收集统计信息
desc user_segtables;
desc user_tables;
2.7.1 user_segments
col segment_name for a10
select segment_name,BLOCKS from user_segments where segment_name='T1';
8表⽰分配了8个块
2.7.2 user_tables
直接查看,没有信息显⽰
select table_name,blocks,empty_blocks from user_tables where table_name='T1';
分析表收集统计信息,再次查看
analyze table t1 compute statistics;
select table_name,blocks,empty_blocks from user_tables where table_name='T1';
2.8 段管理⽅式
⾃动段空间管理和⼿动段空间管理最⼤区别在空闲块的管理
2.8.1 ⾃动管理⽅式ASSM
Auto Segment Space Management简称ASSM
采⽤位图bitmap管理段的存储空间
空闲空间在数据库段中可以⾃动管理。
段空闲的或者使⽤的空间被记录在位图中。
利⽤这个特点,当创建⼀个本地管理表空间时使⽤⾃动的段空间管理
⾃动空间管理段有⼀组位图块(BMBs)描述段中空间使⽤的数据块。
BMB以树状组织。
根层包含所有要参照的BMB,存储在段头。
叶⼦层代表着段中⼀组连续数据块的空间信息。
最多只能有三层。
使⽤⾃动空间管理(automatic space management)的好处:
更好的空间利⽤率,特别是对于⾏⼤⼩变化很⼤的对象
更好地调整并发访问中的变化
在性能或空间利⽤率⽅⾯更好的多实例⾏为
原理:简单说就是每个段的段头都有⼀组位图(5个位图),位图描述每个块的满度,根据满度的不同将每个块登记到相应的位图上,位图⾃动跟踪每个块的使⽤空间(动态),5个位图的满度按如下定义:满度100%、75%、50%、25%和0%,⽐如块⼤⼩为8k,你要插⼊⼀⾏是3k的表⾏,那么oracle就给你在满度50%的位图上找个登记的可插⼊的块
ASSM的前提是EXTENT MANAGEMENT LOCAL,在ORACLE9i以后,缺省状态为⾃动管理⽅式
ASSM废弃pctused属性
2.8.2 ⼿⼯管理⽅式MSSM
Manual Segment Space Managementj简称MSSM
采⽤FREELIST(空闲列表)管理段的存储空间
原理:这是传统的⽅法,现在仍然在使⽤,涉及三个概念freelist、pctfree和 pctused
1. freelist:空闲列表中登记了可以插⼊数据的可⽤块,位置在段头,插⼊表⾏数据时⾸先查找该列表
2. pctfree:⽤来为⼀个块保留的空间百分⽐,以防⽌在今后的更新操作中增加⼀列或多列值的长度。
达到该值,从freelist清除该块信息
3. pctused:⼀个块的使⽤⽔位的百分⽐,这个⽔位将使该块返回到可⽤列表中去等待更多的插⼊操作。
达到该值,该块信息登录到freelist
这个参数在ASSM下不使⽤。
ASSM使⽤位图状态位取代了pctused
3 EXTENT(区)
3.1 特点
区是ORACLE进⾏存储空间分配的基本单位。
⼀个区是由⼀系列逻辑上连续的Oracle数据块组成的逻辑存储结构。
段中第⼀个区叫初始区,随后分配的区叫后续区
3.2 管理⽅式
1)字典管理:在数据字典中管理表空间的区空间分配。
Oracle 8i以前只有通过uet$和fet$的字典管理
缺点:某些在字典管理⽅式下的存储分配有时会产⽣递归操作,并且容易产⽣碎⽚,从⽽影响了系统的性能,现在已经淘汰了
2)本地管理:在每个数据⽂件中使⽤位图管理空间的分配。
表空间中所有区(extent)的分配信息都保存在该表空间对应的数据⽂件的头部
每个区的⼤⼩:autoallocate ⾃动调整/uniform size 固定⼤⼩
优点:速度快,存储空间的分配和可恢复只是简单地改变数据⽂件中的位图,⽽不像字典管理⽅式还需要修改数据库。
⽆碎⽚,更易于DBA 维护
3.3 【表和区的关系】
当建⽴表的时候建⽴段,然后⾃动分配相应的extent(1个或者多个),亦可以⼿⼯提前分配extent(⽤于需⼤量插⼊数据的表)
实验:查看段的初始区分配情况
create tablespace test datafile '/u01/app/oracle/oradata/ORCL/test01.dbf' size 10M;
create table scott.t1 tablespace test as select*from scott.dept;
col segment_name for a15
select SEGMENT_NAME,FILE_ID,EXTENT_ID,BLOCK_ID,BLOCKS,BYTES/1024 K from dba_extents where segment_name='T1';
col file_name for a50
select file_id,file_name,tablespace_name from dba_data_files;
scott⽤户插⼊数据,直到空间不⾜报错
insert into t1 select*from t1;
查看dba_extents分配情况
select SEGMENT_NAME,FILE_ID,EXTENT_ID,BLOCK_ID,BLOCKS,BYTES/1024 K from dba_extents where segment_name='T1';
添加数据⽂件
alter tablespace test add datafile '/u01/app/oracle/oradata/ORCL/test02.dbf' size 20M autoextend on;
scott再次插⼊数据
insert into t1 select*from t1;
commit;
查看dba_extents
查看分配的总块
select sum(blocks) from dba_extents where segment_name='T1';
select blocks from dba_segments where segment_name='T1';
查看使⽤的总块
analyze table scott.t1 compute statistics;
select table_name,blocks,empty_blocks from dba_tables where table_name='T1';
4 BLOCK(数据块)
4.1 OracleBlock的构成
BLOCK是Oracle进⾏存储空间IO操作的最⼩单位。
构成上分为block header、free space、data数据块头部:
ITL:事务槽,可以有多个ITL以⽀持并发事务,每当⼀个事务要更新数据块⾥的数据时,必须先得到⼀个ITL槽,然后将当前事务ID,事务所⽤的undo数据块地址,SCN号,当前事务是否提交等信息写到ITL槽⾥
initrans:初始化事务槽的个数,表默认1,index默认为2
maxtrans:最⼤的事务槽个数(默认255)
ROW DIR:⾏⽬录,指向⾏⽚段⾏起始和结束的偏移量
4.2 块空间的管理
空间管理包括在块级别管理空闲空间,伴随着Automatic Segment Space Management,每个块被分为四个部分:FS1(between 0 and 25% of free space),FS2(25% to 50% free),FS3(50% to 75% free) and FS4(75% to 100% free)
根据块中空闲空间的级别,它的状态会⾃动更新。
这样,根据插⼊⾏的长度,您可以判断是否可以使⽤特定的块来满⾜插⼊操作。
注意,“full”状态意味着块不再可⽤于插⼊
4.3 ⾏链接和⾏迁移
4.3.1 什么是⾏链接和⾏迁移
⾏链接:指⼀⾏存储在多个块中的情况,即⾏链接是跨越多块的⾏
插⼊时,⼀个块存不下,insert到多个块中
⾏迁移:指⼀个数据⾏由于update语句导致当前块被重新定位到另⼀个块(那⾥有充⾜的空间)中,但在原始块中会保留⼀个指针。
原始块中的指针是必需的,因为索引的ROWID项仍然指向原始位置
⾏迁移是update语句当pctfree空间不⾜时引起的,它与insert和delete语句⽆关
在两种情况下,表中的⼀⾏数据可能太⼤填满了⼀个数据块。
第⼀种情况,在第⼀次插⼊数据时,⾏太⼤填满了⼀个数据块。
在这种情况下,Oracle以数据块的链形式存储⾏数据。
在⾏太⼤的情况下容易出现⾏链接,例如⾏包含数据类型为LONG或LONG RAW的列。
⾏链接在这些情况下是不可避免的
然⽽在第⼆种情况下,数据块中原始的⾏被更新,因此⾏的长度增加,并且块的空闲空间总是完全被填充。
在这种情况下,Oracle移动整⾏数据到另⼀个新的数据块,假设整⾏被填充到了⼀个新块,数据库保留⼀个被迁移⾏指向新块的原始⾏piece。
迁移⾏的ROWID信息不会改变
4.3.2 如何知道发⽣了⾏链接或⾏迁移
查看dba_tables的AVG_ROW_LEN列和CHAIN_CNT列
drop table t1 purge;
create table t1 (c1 varchar2(20));
begin
for i in1..1000 loop
insert into t1 values(null);
end loop;
end;
/
先分析⼀下t1表,确定⽆⾏迁移
analyze table t1 compute statistics;
select pct_free,pct_used,avg_row_len,chain_cnt,blocks from user_tables where table_name='T1';
select SEGMENT_NAME,FILE_ID,EXTENT_ID,BLOCK_ID,BLOCKS,BYTES/1024 K from dba_extents where segment_name='T1';
填充这些空列,再分析t1,有了⾏迁移
update t1 set c1='orcl is my name';
commit
analyze table t1 compute statistics;
select pct_free,pct_used,avg_row_len,chain_cnt,blocks from user_tables where table_name='T1';
说明1000⾏中有840⾏发⽣了⾏迁移
4.3.3 ⾏迁移
@?/rdbms/admin/utlchain.sql
analyze table scott.t1 LIST CHAINED ROWS;
select count(*) from chained_rows;
select table_name, HEAD_ROWID from chained_rows where rownum<=3;
select dbms_rowid.ROWID_RELATIVE_FNO(rowid) fn,dbms_rowid.rowid_block_number(rowid) bn, rowid,c1 from scott.t1 where rowid='AAASEGAAHAAAAGTABQ';
4.3.4 解决⾏迁移⽅法
可以根据上例chained_rows表中提供的rowid,将t1表中的那些记录删除,然后在重新插⼊。
这⾥使⽤move解决
alter table t1 move;
move表后,再分析t1,⾏迁移消失
analyze table t1 compute statistics;
select pct_free,pct_used,avg_row_len,chain_cnt,blocks from user_tables where table_name='T1';
4.3.5 ⾏链接
4.3.
5.1 创建表、插⼊普通数据
create table t2 (c1 varchar2(4000),c2 varchar2(4000),c3 varchar2(4000));
begin
for i in1..100 loop
insert into t2 values ('a','b','c');
end loop;
commit;
end;
/
select pct_free,avg_row_len,chain_cnt,blocks from user_tables where table_name='T2';
4.3.
5.2 插⼊⼤于8K⾏
insert into t2 values (lpad('a',4000,'a'),lpad('a',4000,'a'),lpad('a',4000,'a'));
commit;
analyze table t2 compute statistics;
select pct_free,avg_row_len,chain_cnt,blocks from user_tables where table_name='T2';
4.3.
5.3 创建⾮标准块⼤⼩表空间16K
show parameter cache
alter system set db_16k_cache_size=16m;
create tablespace tbs16k datafile '/u01/app/oracle/oradata/ORCL/tbs16k01.dbf' size 20M blocksize 16K;
alter table t2 move tablespace tbs16k;
analyze table t2 compute statistics;
select pct_free,avg_row_len,chain_cnt,blocks from user_tables where table_name='T2';
4.4 ⾼⽔位线HWM
1)什么是⾼⽔位线?
⾼⽔位线(high-water mark,HWM)
在数据库中,如果把表想象成从左到右依次排开的⼀系列块,⾼⽔位线就是曾经包含了数据的最右边的块。
原则上HWM只会增⼤,即使将表中的数据全部删
除,HWM也不会降低
2)HWM有利有弊
优点:可以使HWM以下的块重复利⽤
缺点:使⽤全表扫描时要读取HWM以下的所有block,耗费更多的IO资源
4.5 如何降低HWM⾼⽔位线
多种⽅法可以降低HWM:
移动表
收缩表
导⼊导出表
在线重定义表
4.5.1 移动表move
move⽅法,将表从⼀个表空间移动到另⼀个表空间(也可以在本表空间内move)。
语法:alter table t1 move [tablespace users];
优点:可以清除数据块中的碎⽚,降低⾼⽔位线。
适⽤MSSM和ASSM
缺点:
move需要额外(⼀倍)的空间
move过程中会锁表,其他⽤户不能在该表上做DML或DDL操作
move之后,相关索引都不可⽤了,表上的索引需要重建
create table emp1 as select*from emp;
create index emp1_idx on emp1(ename);
select table_name,index_name,status from user_indexes where table_name='EMP1';
alter table emp1 move;
select table_name,index_name,status from user_indexes where table_name='EMP1';
alter index EMP1_IDX rebuild online;
select table_name,index_name,status from user_indexes where table_name='EMP1';
4.5.2 收缩表shrink
Shrink⽅法,也叫段重组,表收缩的底层实现的是通过匹配的INSERT和DELETE操作
语法:alter table t2 shrink space [cascade][compact];
优点:使⽤位图管理技术,①降低热块,②更合理的重新利⽤空闲块
缺点:①要求段管理是ASSM⽅式,②表上启⽤row movement
它分两个不同的阶段:压缩阶段和降低HWM阶段
第⼀阶段:发出alter table t2 shrink space compact;命令,这是压缩阶段。
在业务⾼峰时可以先完成这样步骤
第⼆阶段:再次alter table t2 shrink space;因压缩阶段⼯作⼤部分已完成,将很快进⼊降低HWM阶段,DML操作会有短哲的锁等待发⽣
对于堆表操作,紧缩操作可能会引起ROWID的变化,在进⾏紧缩之前,必须要开启对应段的⾏迁移,在段级别⾏迁移默认是被禁⽌的。
可以在CREATE TABLE or ALTER TABLE命令时使⽤ENABLE ROW MOVEMENT语句开启
4.5.2.1 创建表、查看信息
create table scott.t3 as select*from dba_objects;
select count(*) from t3;
analyze table t3 compute statistics;
select table_name,blocks,empty_blocks from user_tables where table_name='T3';
Blocks:表⽰使⽤过的块,即低于HWM的块数量
empty_blocks:表⽰extent分配了,但从未使⽤过的块,即⾼于HWM的块数量1441+95=1536是这个段分配的块数select segment_name,blocks from user_segments where segment_name='T3';
4.5.2.2 delete不降低HWM
删除40000⾏
delete from t3 where rownum <=40000;
commit;
analyze table t3 compute statistics;
select table_name,blocks,empty_blocks from user_tables where table_name='T3';
num_rows已经减掉了40000条,但blocks并没有减少,说明HWM没有下降
做shrink
4.5.2.3 使能⾏移动
alter table t3 enable row movement;
4.5.2.4 第⼀步:压缩阶段HWM不降低
alter table t3 shrink space compact;
analyze table t3 compute statistics for table;
select table_name, blocks, empty_blocks, num_rows from user_tables where table_name='T3';
4.5.2.5 第⼆步:降低HWM阶段
alter table t3 shrink space;
analyze table t3 compute statistics;
select table_name, blocks, empty_blocks, num_rows from user_tables where table_name='T3';
4.5.2.6 truncate对⽐
truncate table t3;
analyze table t3 compute statistics;
select table_name, blocks, empty_blocks, num_rows from user_tables where table_name='T3';。