Oracle的表压缩

1、官方文档说法:

Oracle支持在表空间(tablespace)、数据表(table)和分区(Partition)级别的压缩,如果设置为表空间级别,那么默认将该表空间中的全部的表都进行压缩。
压缩操作可以在数据单条插入、数据修改和数据批量导入时发生。

As your database grows in size, consider using table compression. Compression saves disk space, reduces memory use in the database buffer cache, and can significantly speed query execution during reads. Compression has a cost in CPU overhead for data loading and DML. However, this cost might be offset by reduced I/O requirements

随着数据库不断增长,可以考虑使用表压缩。压缩可以节省磁盘空间,减少数据库buffer cache内存使用,并且可以加速查询。
压缩对于数据装载和DML操作有一定的CPU消耗。然而,这些消耗可以为I/O的减少而抵消。

Table compression is completely transparent to applications. It is useful in decision support systems (DSS), online transaction processing (OLTP) systems, and archival systems.

表压缩对于应用程序完全透明。对于DSS系统、在线事务处理和归档系统都很有用处。

You can specify compression for a tablespace, a table, or a partition. If specified at the tablespace level, then all tables created in that tablespace are compressed by default.

你可以为表空间,表或者一个分区指定压缩。如果指定为表空间基本,那么该表空间所有表创建后默认都启用压缩。

Compression can occur while data is being inserted, updated, or bulk loaded into a table. Operations that permit compression include:
压缩可以再数据插入,更新或者批量装载入表中时发生。压缩表允许以下操作:
Single-row or array inserts and updates 单行或多行插入和更新

The following direct-path INSERT methods: 直接路径插入方法:

Direct path SQL*Loader
1)CREATE TABLE AS SELECT statements
2)Parallel INSERT statements
3)INSERT statements with an APPEND or APPEND_VALUES hint

截止目前,Oracle数据库共有4种表压缩技术:
1)Basic compression
2)OLTP compression
3)Warehouse compression (Hybrid Columnar Compression)
4)Archive compression (Hybrid Columnar Compression)

这里我主要介绍基本压缩:

2、基本压缩特点:
1)使用基本压缩,只有当数据是直接路径插入或更新记录(direct-path insert and updated )时才会发生压缩。
并且支持有线的数据类型和SQL操作。

3、如何启用基本压缩?
1)通过create table语句中指定compress条件。
2)通过alter table .. compress; 来给现有表启用压缩;
3)通过alter table .. nocompress; 来禁用表压缩

4、关于基本压缩的一些例子
4.1 创建压缩表

CREATE TABLE emp_comp compress
AS
SELECT * FROM emp
WHERE 1=2;
1
2
3
4
4.2 通过数据字典查看压缩表状态

[email protected]> SELECT table_name, compression, compress_for
2 FROM user_tables
3 WHERE table_name=‘EMP_COMP‘;

TABLE_NAME COMPRESS COMPRESS_FOR
------------------------------ -------- ------------
EMP_COMP ENABLED BASIC
1
2
3
4
5
6
7
4.3 通过非直接路径插入数据

[email protected]> INSERT INTO emp_comp
2 SELECT * FROM emp;

已创建16行。

[email protected]> commit;

--查看表占用
[email protected]> exec show_space(‘EMP_COMP‘,‘SCOTT‘);
Unformatted Blocks .................... 0
FS1 Blocks (0-25) .................... 0
FS2 Blocks (25-50) .................... 0
FS3 Blocks (50-75) .................... 0
FS4 Blocks (75-100) .................... 5
Full Blocks .................... 0
Total Blocks ........................... 8
Total Bytes ........................... 65,536
Total MBytes ........................... 0
Unused Blocks........................... 0
Unused Bytes ........................... 0
Last Used Ext FileId.................... 4
Last Used Ext BlockId................... 14,304
Last Used Block......................... 8

--看下emp的占用
[email protected]> exec show_space(‘EMP‘,‘SCOTT‘);
Unformatted Blocks .................... 0
FS1 Blocks (0-25) .................... 0
FS2 Blocks (25-50) .................... 0
FS3 Blocks (50-75) .................... 0
FS4 Blocks (75-100) .................... 5
Full Blocks .................... 0
Total Blocks ........................... 8
Total Bytes ........................... 65,536
Total MBytes ........................... 0
Unused Blocks........................... 0
Unused Bytes ........................... 0
Last Used Ext FileId.................... 4
Last Used Ext BlockId................... 144
Last Used Block......................... 8

--对比与原EMP表的占用情况,emp_comp表并未压缩。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
注:关于show_space过程的用法,请参考【http://blog.csdn.net/indexman/article/details/47207987】

4.4 通过直接路径插入数据

drop table emp_comp purge;

CREATE TABLE emp_comp compress
AS
SELECT * FROM emp
WHERE 1=2;

insert /*+ append */ into emp_comp
select *
from emp;

--查看表占用
[email protected]> exec show_space(‘EMP_COMP‘,‘SCOTT‘);
Unformatted Blocks .................... 0
FS1 Blocks (0-25) .................... 0
FS2 Blocks (25-50) .................... 0
FS3 Blocks (50-75) .................... 0
FS4 Blocks (75-100) .................... 0
Full Blocks .................... 1
Total Blocks ........................... 8
Total Bytes ........................... 65,536
Total MBytes ........................... 0
Unused Blocks........................... 4
Unused Bytes ........................... 32,768
Last Used Ext FileId.................... 4
Last Used Ext BlockId................... 14,304
Last Used Block......................... 4

--很明显少占用4个数据块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
4.5 禁用表压缩

[email protected]> alter table emp_comp NOCOMPRESS;

表已更改。

[email protected]> SELECT table_name, compression, compress_for
2 FROM user_tables
3 WHERE table_name=‘EMP_COMP‘
4 ;

TABLE_NAME COMPRESS COMPRESS_FOR
------------------------------ -------- ------------
EMP_COMP DISABLED
1
2
3
4
5
6
7
8
9
10
11
12
4.6 启用表压缩

[email protected]> alter table emp_comp COMPRESS;

表已更改。

[email protected]> SELECT table_name, compression, compress_for
2 FROM user_tables
3 WHERE table_name=‘EMP_COMP‘;

TABLE_NAME COMPRESS COMPRESS_FOR
------------------------------ -------- ------------
EMP_COMP ENABLED BASIC
1
2
3
4
5
6
7
8
9
10
11
5、最后来看下表压缩的几个使用限制:
1)对于基本压缩,你无法在压缩表上增加一个带默认值的列:

[email protected]> alter table emp_comp add remark varchar2(200) default ‘null‘;
alter table emp_comp add remark varchar2(200) default ‘null‘
*
第 1 行出现错误:
ORA-39726: 不支持对压缩表执行添加/删除列操作
1
2
3
4
5
2)无法删除压缩表上的列:

[email protected]> alter table emp_comp drop column ename;
alter table emp_comp drop column ename
*
第 1 行出现错误:
ORA-39726: 不支持对压缩表执行添加/删除列操作
1
2
3
4
5
3)表压缩不支持在线段收缩(Online segment shrink)
4)不支持SecureFiles large objects
5)压缩表创建时默认设置PCT_FREE 为 0; 除非你手工指定。

原文地址:https://www.cnblogs.com/dayu-liu/p/11073941.html

时间: 2024-08-29 09:29:48

Oracle的表压缩的相关文章

oracle 11G表压缩

最近一套生产库表空间一直告警在90%以上,但的磁盘硬件资源又不足,整个库已经达到26T.库里存储了近4年的数据,与业务沟通说历史数据基本上不会做操作,但是又不能归档,所以想到了压缩表来节省表空间. 随着数据库的增长,我们可以考虑使用oracle的表压缩技术.表压缩可以节省磁盘空间.减少data buffer cache的内存使用量.并可以显著的提升读取和查询的速度.当使用压缩时,在数据导入和DML操作时,将导致更多的CPU开销,然而,由于启用压缩而减少的I/O需求将抵消CPU的开销而产生的成本.

Oracle 表压缩(Table Compression)技术介绍

Oracle 表压缩(Table Compression)介绍 1.官方文档说法: As your database grows in size, consider using table compression. Compression saves disk space, reduces memory use in the database buffer cache, and can significantly speed query execution during reads. Compr

Oracle压缩功能小结2—预估表压缩的效果

在使用压缩之前,我们可以估算一下使用压缩能够拥有多大的效果. 11gr2以前可以使用dbms_comp_advisor,具体代码已经在附件中给出.只需要执行两个文件dbmscomp.sql和prvtcomp.plb,然后使用DBMS_COMP_ADVISOR.getratio存储过程即可.不再详细描述. SQL> set serveroutput on SQL> execdbms_comp_advisor.getratio('SH','SALES',10) Sampling table: SH

【翻译自mos文章】oracle数据库中 基本的表压缩和高级压缩之间的区别

基本的表压缩和高级压缩之间的区别, 摘录自mos文章Difference Between Basic Table Compression And Advanced Compression (Doc ID 1548187.1) 适用于: Oracle Database - Enterprise Edition - Version 10.2.0.5 and later Information in this document applies to any platform. 目标: What is

oracle装载表是什么?

oracle装载表即通过sqlloader的方式导入数据. Oracle 的SQL*LOADER可以将外部数据加载到数据库表中.下面是SQL*LOADER的基本特点: 1)能装入不同数据类型文件及多个数据文件的数据 2)可装入固定格式,自由定界以及可度长格式的数据 3)可以装入二进制,压缩十进制数据 4)一次可对多个表装入数据 5)连接多个物理记录装到一个记录中 6)对一单记录分解再装入到表中 7)可以用 数对制定列生成唯一的KEY 8)可对磁盘或 磁带数据文件装入制表中 9)提供装入错误报告

oracle热点表online rename

对于在线的繁忙业务表的任何操作都可能带来意想不到的风险.一张业务表,对partition key进行升位,其步骤是: rename原表 新建临时表 交换分区到临时表 升位临时表的字段的长度 交换临时表到第二张临时表 rename第二种临时表为业务表 整个的操作过程如果顺利,预计在10s左右,如果放在文件中,速度会很快.下面模拟繁忙表进行测试: #!/bin/sh . /home/oracle/.bash_profile sqlplus -S /nolog<<EOF conn test/test

优化系列 | InnoDB引擎数据表压缩特性测试

一.前言Innodb Plugin引擎开始引入多种格式的行存储机制,目前支持:Antelope.Barracuda两种.其中Barracuda兼容Antelope格式.另外,Innodb plugin还支持行数据压缩特性,不过前提是采用Barracuda行存储格式.表空间启用压缩的前提是innodb表空间文件存储格式修改成:Barracuda,需要修改2个选项:innodb_file_format = "Barracuda"innodb_file_format_max = "

Oracle Temp 表空间切换

一.TEMP表空间作用 临时表空间主要用途是在数据库进行排序运算.管理索引.访问视图等操作时提供临时的运算空间,当运算完成之后系统会自动清理.当 oracle 里需要用到 sort 的时候, PGA 中 sort_area_size 大小不够时,将会把数据放入临时表空间里进行排序,同时如果有异常情况的话,也会被放入临时表空间 , 正常来说,在完成 Select 语句.create index 等一些使用 TEMP 表空间的排序操作后, Oracle 是会自动释放掉临时段的.注意这里的释放,仅仅是

Oracle 重建表(rename)注意事项总结

一.概述 前一段时间,有一个DBA朋友在完成重建表(rename)工作后,第二天早上业务无法正常运行,出现数据无法插入的限制和错误,后来分析才发现,错误的原因是使用rename方式重建表以后,其它引用这个表的外键约束指向没有重新定义到这个重建的新表中,从而导致这些表在插入新数据时,违反数据完整性约束,导致数据无法正常插入.影响了业务大概有1个多小时,真是一次血淋淋的教训啊. 使用rename方式重建表是我们日常DBA维护工作中经常使用的一种方法,因为CTAS+rename这种配合方式,非常实用和