OLTP 表压缩

压缩始终是非常占用CPU的过程,并且需要花费一定时间,通常,如果压缩数据,则数据必须解压缩后才能使用。虽然此要求在数据仓库环境中是可以接受的但在OLTP环境中可能无法接受

现在,在Oracle数据库11g中,可以执行以下命令:

create table my_compressed_table (
  col1 number(20),
  col2 varchar2(300),
  ...
)
compress for all operations

“compress for all operations”子句在所有DML活动(如 INSERT、UPDATE等)上执行压缩,压缩在所有DML活动上发生,而不像oracle11g之前的版本那样,只在直接路径加载上发生

OLTP table compress的原理

当我们对一个表使用alter table <<table_name>> compress for oltp语句时,对已有的数据不受影响。但是他对一个块中新insert或update的行最开始也不受影响,直到这个数据块达到PCTFREE时才触发压缩,于是,现在新的压缩其实就是从老的方法:对每条新增的行做compress,变成了对一个block中的所有行批量处理,这样就让大部分的insert/update语句没有性能上的损失,只对insert/update导致某个块刚好达到PCTFREE的语句有一些负载

当一个块由于触发压缩,而导致块的数据又低于PCTFREE的临界点后,这个块又可以接受更多的数据,会又一次达到PCTFREE,就会又一次压缩

由于压缩作为触发事件发生,而不是在插入行时发生,因此在正常的DML进程中压缩对性能没有任何影响。压缩被触发后,对CPU的需求肯定会变得很高,但在其他任何时间CPU影响都为零,因此压缩也适用于OLTP应用程序

OLTP compressed table和传统老的compressed table的空间利用情况的比较

conn /as sysdba
grant select on dba_objects to scott; conn scott/tiger
create table newcomp compress for oltp as select * from dba_objects;
create table oldcomp compress as select * from dba_objects;
create table notcomp as select * from dba_objects; select table_name, compress_for from user_Tables where table_name in ('NEWCOMP','OLDCOMP','NOTCOMP'); select segment_name, sum(bytes)/1024 KB from user_extents where segment_name in ('NEWCOMP','OLDCOMP','NOTCOMP') group by segment_name;

两种压缩方式在最开始的时候差不多大

update newcomp set object_name = object_name||'abc';
update oldcomp set object_name = object_name||'abc';
update notcomp set object_name = object_name||'abc';
commit; select segment_name, sum(bytes)/1024 KB from user_extents where segment_name in ('NEWCOMP','OLDCOMP','NOTCOMP') group by segment_name;

在大量更新后,我们发现,传统的表压缩逐渐丢失了自己压缩的特性,而OLTP compressed table却依然保持良好的压缩性能

drop table OLDCOMP purge;
drop table NEWCOMP purge;
drop table NOTCOMP purge;

收缩段

SQL> grant select on dba_objects to scott;

SQL> conn scott/tiger
SQL> create table t as select * from dba_objects;
SQL> create index ind_t on t(object_id); SQL> exec dbms_stats.gather_table_stats('scott', 't', cascade=>true);
SQL> select num_rows, blocks from user_tables where table_name='T';
SQL> delete t where rownum<=30000;
SQL> commit; SQL> exec dbms_stats.gather_table_stats('scott', 't', cascade=>true);
SQL> select num_rows, blocks from user_tables where table_name='T'; SQL> alter table t enable row movement;
SQL> alter table t shrink space compact;
SQL> exec dbms_stats.gather_table_stats('scott', 't', cascade=>true);
SQL> select num_rows, blocks from user_tables where table_name='T'; SQL> alter table t shrink space;
SQL> exec dbms_stats.gather_table_stats('scott', 't', cascade=>true);
SQL> select num_rows, blocks from user_tables where table_name='T'; SQL> select status from user_indexes where table_name='T' --段收缩之后索引仍然有效(valid);
SQL> delete t;
SQL> commit; SQL> alter table t shrink space;----默认执行两步
SQL> exec dbms_stats.gather_table_stats('scott', 't', cascade=>true);
SQL> select num_rows, blocks from user_tables where table_name='T';

处理挂起的事务
暂停失败的事物,不要回退,处理故障后继续运行源语句(9i的新特性)
当事务缺少某些资源不能运行的时候数据库会有两种处理方法:
一:自动的回退,当我们运行大的事物时,回退是很大的工作量
二:数据库可以将事物挂起,等待新的资源到来,继续进行处理没有完成的事物,我们可以设置等待的时间,可以检测等待的资源

SQL> drop tablespace t2m including contents and datafiles;
SQL> create tablespace t2m datafile '/u01/app/oracle/oradata/orcl/t2m.dbf' size 1m autoextend off; SQL> conn scott/tiger
SQL> drop table e purge;
SQL> create table e tablespace t2m as select * from emp;
SQL> insert into e select * from e; SQL> /
insert into e select * from e
ORA-01653: 表 SCOTT.E 无法通过 8 (在表空间 T2M 中) 扩展

只回退当前的语句,其他插入还在,等待我们结束事务。

conn /as sysdba
SQL> grant execute on dbms_resumable to scott;
SQL> grant resumable to scott; conn scott/tiger
SQL> alter session enable resumable timeout 3600;

启用挂起的特性

conn /as sysdba
grant select on v_$mystat to scott;
SQL> select sid from v$mystat where rownum=1;
--查看当前的会话
SQL> select dbms_resumable.get_session_timeout(151) from dual;
SQL> insert into e select * from e;
--现在挂起不动了,等待资源,我们新开一个会话
SQL> conn system/a
SQL> select event from v$session_wait where sid=151;
--看151会话在等待什么
SQL> select error_msg from dba_resumable; SQL> select file_id from dba_data_files where tablespace_name='T2M';
SQL> alter database datafile 7 resize 3m; --再回到第一个会话,我们看到
14336 rows inserted
SQL> commit;

OCP读书笔记(18) - 空间管理的更多相关文章

  1. 存储器的保护(一)——《x86汇编语言:从实模式到保护模式》读书笔记18

    本文是原书第12章的学习笔记. 说句题外话,这篇博文是补写的,因为让我误删了,可恶的是CSDN的回收站里找不到! 好吧,那就再写一遍,我有坚强的意志.司马迁曰:“文王拘而演<周易>:仲尼厄 ...

  2. OCP读书笔记(12) - 执行闪回数据库

    闪回数据库使用的是闪回日志,闪回日志存在于闪回目录(也就是快速闪回区中)闪回日志:就是数据块修改之前的镜像,简称前像 1.查看闪回目录的位置:show parameter recovery 如果闪回目 ...

  3. OCP读书笔记(2) - 配置恢复

    RMAN的命令类型 1. sqlplus命令 [oracle@oracle admin]$ export ORACLE_SID=orcl [oracle@oracle admin]$ rman tar ...

  4. OCP读书笔记(19) - 数据库空间管理

    传输表空间:将linux下的数据库中的test表空间传输到windows平台下的数据库 在传输表空间前,先确定一下源库与目标数据库字符集一致: select * from nls_database_p ...

  5. OCP读书笔记(13) - 管理内存

    SGA 1. 什么是LRULRU表示Least Recently Used,也就是指最近最少使用的buffer header链表LRU链表串联起来的buffer header都指向可用数据块 2. 什 ...

  6. OCP读书笔记(14) - 管理数据库性能

    搜集统计信息 1. dbms_stats gather_schema_stats 1)option:有四个选项: a.gather empty:只分析目前还没有搜集过统计信息的表 SQL> co ...

  7. OCP读书笔记(16) - 管理资源

    使用者组 创建资源用户组OLTP_GRP,将用户HR,OE加入此组: BEGIN dbms_resource_manager.clear_pending_area(); dbms_resource_m ...

  8. OCP读书笔记(15) - 管理SQL性能调优

    SQL Tuning Advisor(STA): 使用oracle提供的程序包进行sql优化 SQL> conn scott/tiger SQL), name )); SQL> inser ...

  9. 《Linux内核设计与实现》读书笔记 18

    第十八章调试 18.1 准备开始 一个bug:大部分bug通常都不是行为可靠而且定义明确的 一个藏匿bug的内核版本:找出bug首先出现的版本 相关内核代码的知识和运气 18.2内核中的bug 可以有 ...

随机推荐

  1. 编译Boost 详细步骤 适用 VC6 VS2003 VS2005 VS2008 VS2010

    vs2008编译boost [一.Boost库的介绍] Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库 ...

  2. UVA11069 - A Graph Problem(DP)

    UVA11069 - A Graph Problem(DP) 题目链接 题目大意:给你n个点.要你找出有多少子串符合要求.首先没有连续的数字,其次不能再往里面加入不论什么的数字而不违反第一条要求. 解 ...

  3. Swift - 本地数据的保存与加载(使用NSCoder将对象保存到.plist文件)

    下面通过一个例子将联系人数据保存到沙盒的“documents”目录中.(联系人是一个数组集合,内部为自定义对象). 功能如下: 1,点击“保存”将联系人存入userList.plist文件中 2,点击 ...

  4. dm642在线写EPROM.txt

    void wirteEPROM() { //#include <stdio.h>     unsigned short bufeprom[30],i,val;  FILE *fp;     ...

  5. 《Struts2技术内幕》学习笔记

    第2.3章 基础 三种类模式:属性-行为模式.属性模式.行为模式. 其中属性模式有:PO(持久化对象).BO(业务对象).VO(值对象).DTO(传输数据对象).FromBean(页面对象)他们是对J ...

  6. 编写生成彩色验证码的Servlet

    利用Ajax实现无刷新的彩色验证码时,也需要编写一个名称为PictureCheckCode.java的Servlet,该类继承HttpServlet,主要通过service()方法生成验证码. 下面将 ...

  7. hdu 4284 Travel(floyd + TSP)

    虽然题中有n<=100个点,但实际上你必须走过的点只有H<=15个.而且经过任意点但不消耗C[i]跟D[i]可以为无限次,所以可以floyd预处理出H个点的最短路,之后剩下的...就成了裸 ...

  8. 疯狂Android演讲2 环境配置

    笔者:本笃庆军 原文地址:http://blog.csdn.net/qingdujun/article/details/37053681 jdk-6u3-windows-i586-p.exe  下载地 ...

  9. (Google面试题)有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。

    现要让四个文件呈如下格式: A:1 2 3 4 1 2.... B:2 3 4 1 2 3.... C:3 4 1 2 3 4.... D:4 1 2 3 4 1.... 请设计程序. 下面举例A,对 ...

  10. 在WPF的WebBrowser控件中抑制脚本错误

    原文:在WPF的WebBrowser控件中抑制脚本错误 今天用WPF的WebBrowser控件的时候,发现其竟然没有ScriptErrorsSuppressed属性,导致其到处乱弹脚本错误的对话框,在 ...