暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle基础学习之表压缩

IT那活儿 2022-11-22
3792

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!


背景介绍

Oracle支持在表空间(tablespace)、数据表(table)和分区(Partition)级别的压缩,如果设置为表空间级别,那么默认将该表空间中的全部的表都进行压缩。
压缩操作可以在数据单条插入、数据修改和数据批量导入时发生。
随着数据库不断增长,可以考虑使用表压缩。压缩可以节省磁盘空间,减少数据库buffer cache内存使用,并且可以加速查询。
压缩对于数据装载和DML操作有一定的CPU消耗。然而,这些消耗可以为I/O的减少而抵消。
表压缩对于应用程序完全透明。对于DSS系统、在线事务处理和归档系统都很有用处。
你可以为表空间,表或者一个分区指定压缩。如果指定为表空间基本,那么该表空间所有表创建后默认都启用压缩。
压缩可以再数据插入,更新或者批量装载入表中时发生。
压缩表允许以下操作:
Single-row or array inserts and updates 单行或多行插入和更新。

特点:

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


建立测试表

create table t_compress1(a number,b number,c number) compress pctfree 0;


生成测试数据

insert /*+ append*/ into t_uncompress select 
rownum,mod(rownum,10000),mod(rownum,3) from 
all_objects,all_objects where rownum<300000;


直接路径插入

insert /*+ append*/ into t_compress1 select * from t_uncompress order by a;


普通方法插入

insert into t_compress4 select * from t_uncompress order by c;


查看各压缩列(order by)的压缩率

select table_name,round((blocks-EMPTY_BLOCKS)/(select 
blocks-EMPTY_BLOCKS from user_tables where 
table_name='T_UNCOMPRESS')*100,2) pct from user_tables where 
table_name like '%T_COMPRESS%';

由此看出,order by(压缩列)的列不同会导致压缩率的不同,这里是B压缩列压缩率最高。


查看数据分布情况

select column_name,NUM_NULLS,NUM_DISTINCT,AVG_COL_LEN from user_tab_columns where table_name='T_UNCOMPRESS';


结论

8.1 选择性较低、长度较大的列作为压缩列会得到较高的压缩率
如果列是选择性很高,则根据该列压缩没有意义,甚至可能压缩后占用空间比不压缩更高。
如果不指定order by,oracle会自动选择一个合适的列作为压缩列,但压缩率不一定是最高的。
8.2 普通的DML不会压缩数据
只有以下情况才会对数据进行压缩:
o insert /*+ append * /
o create table as select
o direct path loads
o moves



本文作者:杨 浩(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论