1.前言
这里说一下Oracle的数据结构(逻辑存储架构)
2.Oracle的数据存储结构
1)表空间(tablespace) -- oracle最大的逻辑存储单位
2) 数据文件(data file) -- 表空间物理存储载体(裸设备除外)
3)段(segment) -- oracle所有占用空间的对象的总称
4)extent --段的组成单位
5)数据块(data block) -- extent 的组成单位, 是oracle存储和数据操作的最小单位
3.tablespace(表空间)
表空间类型:
1)permanent:永久表空间
2)undo: 撤销表空间
3)temporary:临时表空间
管理方式:
段和区的管理方式是在建立表空间时确定的
段管理方式有auto和manual两种,区管理方式有本地管理和字典管理(已淘汰)两种。
注意:
1)如果system表空间是数据字典管理,其他表空间可以是数据字典管理或者本地管理local(本地)
2)字典管理可以转换为本地管理,但是对于系统表空间,要求执行一些附加步骤,比较麻烦
SQL>execute dbms_space_admin.tablespace_migragte_to_local('tablespacename');
基本操作:
1)创建表空间:
sql>create tablespace test datafile '/data/oracle/oradata/orcl/test01.dbf' size 10m;
这里可以利用oracle提供的dbms_metadata.get_ddl包看看缺省值都给的是什么?
SQL>set serverout on; SQL> declare aa varchar2(2000); begin select dbms_metadata.get_ddl('TABLESPACE','TEST') into aa FROM dual; dbms_output.put_line(aa); end; / 2 3 4 5 6 7
结果: CREATE TABLESPACE "TEST" DATAFILE '/data/oracle/oradata/orcl/test01.dbf' SIZE 10485760 LOGGING ONLINE PERMANENT BLOCKSIZE 8192 EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO ##关注最后一行,两个重要信息是:(1)区本地管理且自动分配空间,(2)段自动管理。
PL/SQL procedure successfully completed. SQL>
2)删除表空间
SQL>drop tablespace 表空间名 including contents and datafiles;
contents:包括控制文件和数据字典信息,
datafiles:这个物理文件
数据库在open状态的时候不能删除如下表空间:
1.system 2.active undo tablespace 3.default temporary tablespace 4.default tablespace
数据库在open状态的时候不能offline的表空间的是:
1.system 2.active undo tablespace 3.default temporary tablespace
3)常用的查表空间命令
1.查看表空间大小 SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_data_files group by tablespace_name; 2.查看表空间空闲大小 SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_free_space group by tablespace_name; 3.查看表空间(数据文件)是否是自动扩展 SQL> col file_name for a40; SQL> select file_name,tablespace_name,bytes/1024/1024 mb,autoextensible from dba_data_files;
4)建立大文件的表空间
small file:在一个表空间中可以建立多个数据文件(默认)
bigfile:在一个表空间中只能建立一个数据文件(该数据文件最大可达32T),简化对数据管理
SQL> create bigfile tablespace big_tbs datafile '/u01/oradata/prod/bigtbs01.dbf' size 100m; 试图在该表空间下增加一个数据文件会报错 SQL> alter tablespace big_tbs add datafile '/u01/oradata/prod/bigtbs02.dbf' size 100m; 报错:ORA-32771: cannot add file to bigfile tablespace 查看大文件表空间: SQL> select name,bigfile from v$tablespace;
大文件表空间
优势:
-减少数据库的数据文件个数(每个数据库64个数据文件)
-方便文件管理,不需要人工干预表空间的文件大小
-减少数据库对文件头同步开销
3.segment(段)
在oracle中,凡是被分配了空间的对象,都称之为段。
特点:
1)表空间在逻辑上可以对应多个段,物理上是对应的是多个数据文件,一个段比较大时可以跨多个数据文件。
2)创建一个表,oralce会为表创建一个(或多个)段,在一个段中保存该表的所有表数据(表数据不能跨段)
3)段中至少有一个初始区,当这个段数据增加使得区(extent)不够时,将为这个段分配新的后续区。
临时段:
1)临时段也叫临时表空间,一般用作排序,(hash,merge... 需要一个中间数据处理区域,)
2)只要当oracle内存不够时,oracle才会在临时表空间上创建临时段
3)临时段上的操作并不会记录redo log
临时表:
1)Oracle临时表只存在于某个会话或者事务的生命周期里,此时临时表的数据只对这个会话可见。
2)临时表经常被用于存放一个操作的中间数据(数据的中间处理环节)
3)临时表由于不产生redo,故能提高数据操作性能。
4)临时表上也是可以创建索引的
创建临时表:
语法:
create global temporary 临时表名 on commit delete rows
on commit delete row:临时表中的数据基于事务的,当事务提交或者回滚时,临时表中的数据将被清空
on commit preserve row:临时表中的数据基于回话,当回话结束后,临时表中的数据被清空了
段压缩:
1) oracle允许对段进行压缩
2)优点:1.减少存储空间,2.减少处理数据块(减少内存占用、提高io速度、提高查询效率)
3)缺点:因为要额外地对数据进行处理,在数据插入时,会消耗更多的资源和时间
语法:
>create table 表名 compress as select * from dba_objects; ##设置压缩
>alter table 表名 nocompress ##取消压缩
段压缩级别:
1)表空间级别 2)表级(索引) 3)分区 4)子分区
表空间级别:
>create table 表名 tablespace 表空间名 as select * from dba_objects; ##这里的表空间是已经压缩过了的,然后再在这个表空间中创建表
>select table_name,compression from user_tables where table_name='表名‘;
段的管理方式:
1)自动管理方式:简称ASSM(Auto segment space management) 采用位图管理段的存储空间
简单说就是每个段的段头都有一组位图(5个位图),位图描述每个块的满度,根据满度的不同将每个块登记到相应的位图上,位图自动跟踪每个块的使用空间(动态),5个位图的满度按如下定义:满度100%,75%、50%、25%和0%,比如块大小为8k,你要插入一行是3k的表行,那么oracle就给你在满度50%的位图上找个登记的可插入的块。减少热点;
ASSM的前提是EXTENT MANAGEMENT LOCAL,在ORACLE9I以后,缺省状态为自动管理方式,ASSM废弃pctused属性。
自动段管理优缺点:
优点:
-简化管理,ASSM避免了手动设置参数大量的存储相关的参数,除了唯一的一个uctfree
-增大并发度,如果有多个事务并发方位一个段,对于MSSM,由于使用freelist列表进行空间管理,导致大量的会话访问这些列表,出现资源的等待和争用,ASSM由于不使用freelist方式管理空间,会有效避免资源哦争用和等待。
-Rac模式下可以改善并发性能(不需要各个实例间相互访问大量的freelist列表)
缺点:
-FTS(全表扫描)
-大数据的加载,会导致性能下降
-影响索引的集群因子(clustering factor)
2) 手动管理方式:简称MSSM(manual segment space management) 采用的是freelist(空闲列表)管理段的存储空间。
原理是:这时传统的方式,现在也在使用,涉及三个概念:freelist、pctfree、pctused.
freelist:空闲列表中登记了可以插入数据的可用块,位置在段头,插入表行数据时首先查找该列表。
pctfree:用来为一个块保留的空间百分比,以防止在今后的更新操作中增加一列或多列值的长度。达到该值,从freelist清除该块信息
pctused:一个块的使用水位的百分比,这个水位将使该块返回到可用列表中去等待更多的插入操作。达到该值,该块信息登录到freelist
pctused这个参数在ASSM下不使用,ASSM使用位图状态位取代了pctused.
3)创建MSSM对象
SQL>create tablespace ts_mssm segment space management manual; SQL>create table t_m(id int) pctfree 20 pctused 20 storage(freelist 20 next 5M) tablespace ts_mssm;
SQL>select pct_free,pct_used,freelists from user_tables where table_name='T_M'; ##查看相关信息
4)手动段管理特点
优点:1.给与DBM更大的空间管理余地 2.对于一些数据块操作非常敏感的场景依然有用。
缺点:1.参数设置多. 2.参数设定值困难 3.需要更高水平的DBA
.