[20180814]慎用查看表压缩率脚本.txt

--//最近看exadata方面书籍,书中提供1个脚本,查看某些表采用那些压缩模式压缩比能达到多少.
--//通过调用DBMS_COMPRESSION.get_compression_ratio确定压缩比.例子如下:

--//测试版本11.2.0.4.
declare
        blockct_comp    number;
        blockct_uncomp  number;
        rows_comp       number;
        rows_uncomp     number;
        comp_rat        number;
        comp_type       varchar2(40);
begin
          dbms_compression.get_compression_ratio(‘&&tblspc‘,‘&&ownr‘,‘&&tblname‘,null,  dbms_compression.comp_for_oltp,        blockct_comp, blockct_uncomp,rows_comp,rows_uncomp, comp_rat, comp_type);
          dbms_output.put_line(‘Compression type: ‘||comp_type||‘     Compression ratio (est):‘||comp_rat);
          dbms_compression.get_compression_ratio(‘&&tblspc‘,‘&&ownr‘,‘&&tblname‘,null,  dbms_compression.comp_for_query_low,   blockct_comp, blockct_uncomp,rows_comp,rows_uncomp, comp_rat, comp_type);
          dbms_output.put_line(‘Compression type: ‘||comp_type||‘     Compression ratio (est):‘||comp_rat);
          dbms_compression.get_compression_ratio(‘&&tblspc‘,‘&&ownr‘,‘&&tblname‘,null,  dbms_compression.comp_for_query_high,  blockct_comp, blockct_uncomp,rows_comp,rows_uncomp, comp_rat, comp_type);
          dbms_output.put_line(‘Compression type: ‘||comp_type||‘     Compression ratio (est):‘||comp_rat);
          dbms_compression.get_compression_ratio(‘&&tblspc‘,‘&&ownr‘,‘&&tblname‘,null,  dbms_compression.comp_for_archive_low, blockct_comp, blockct_uncomp,rows_comp,rows_uncomp, comp_rat, comp_type);
          dbms_output.put_line(‘Compression type: ‘||comp_type||‘     Compression ratio (est):‘||comp_rat);
          dbms_compression.get_compression_ratio(‘&&tblspc‘,‘&&ownr‘,‘&&tblname‘,null,  dbms_compression.comp_for_archive_high,blockct_comp, blockct_uncomp,rows_comp,rows_uncomp, comp_rat, comp_type);
          dbms_output.put_line(‘Compression type: ‘||comp_type||‘     Compression ratio (est):‘||comp_rat);
end;
/

--//好奇心我想看看生产系统一张大表能达到多少.我执行上面的脚本,结果等大约2-3分钟没有结果出来,我马上中断处理.
--//我当时想既然大表可能分析数据量大,换1个点的表看看.
--//结果执行后包如下错误:

ERROR at line 1:
ORA-20000: YOU CAN NOT TRUNCATE or DROP CMP3$97116 TABLE!
ORA-06512: at line 6
ORA-06512: at "SYS.PRVT_COMPRESSION", line 1136
ORA-06512: at "SYS.PRVT_COMPRESSION", line 1114
ORA-20000: YOU CAN NOT TRUNCATE or DROP CMP1$97116 TABLE!
ORA-06512: at "SYS.DBMS_COMPRESSION", line 214
ORA-06512: at line 9

--//BTW:我们生产系统有系统触发器,禁止用户drop和truncate表.这样导致脚本运行报错.
--//我看了一下CMP3$97116,CMP1$97116表结果,和分析表结构一致.

CREATE TABLE xxxxxx_yyy.CMP4$97116
(
  ZYH        NUMBER(18)                         NOT NULL,
  ....
  YB_DBZ     VARCHAR2(4 BYTE)
)
TABLESPACE xxxxxx_yyy
RESULT_CACHE (MODE DEFAULT)
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MAXSIZE          UNLIMITED
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
            FLASH_CACHE      DEFAULT
            CELL_FLASH_CACHE DEFAULT
           )
NOLOGGING
COMPRESS FOR OLTP
~~~~~~~~~~~~~~~
NOCACHE
NOPARALLEL
MONITORING;

--//可以看出DBMS_COMPRESSION.get_compression_ratio操作很简单,先建立与分析表一样的表结构以及对应压缩模式的表,然后
--//导入数据后比较分析压缩比.
--//这样要耗费大量表空间与资源做这个工作,在生产系统要小心谨慎.

--//我事后认真看了<深入理解ORACLE Exadata> P98页.而是讲样本数据插入一个临时表中.同时压缩版本的临时表也被创建,比较压缩
--//版本和非压缩版本的大小就可以得到压缩率.
--//(注:我看到的不是临时表,而是真实的表,看上面的表定义.或许作者理解的临时表非我理解的临时表)
--//我不知道取样比例是多少,总之在生产系统执行该脚本还是要小心.
--//另外书P101提到 压缩助手的一大亮点是能够在非exadata平台上运行,在真正迁移数据到exadata平台之前,它能够提供足够的信息
--//帮助你做出合理的选择.这么讲非exadata平台还是能够建立hcc压缩模式的相关数据,只不过你不能查看.

--//我曾经在dg上查看压缩表信息,链接[20150727]exadata压缩HCC与dataguard.txt=>http://blog.itpub.net/267265/viewspace-1753362/
[email protected]> select * from t where rownum<=1;
select * from t where rownum<=1
              *
ERROR at line 1:
ORA-64307:  Exadata Hybrid Columnar Compression is not supported for tablespaces on this storage type

--//在家里测试的结果.
[email protected]> @ ver1

PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

create table t as select * from all_objects ;
--//反复插入,提示要大于1000000rows才可以.

[email protected]> select count(*) from t;

COUNT(*)
----------
   1437952
--//占用192M.

Compression type: "Compress Advanced"     Compression ratio (est):3.5
Compression Advisor self-check validation successful. select count(*) on both Uncompressed and EHCC Compressed format = 1000001 rows
Compression type: "Compress Query Low"     Compression ratio (est):8.6
Compression Advisor self-check validation successful. select count(*) on both Uncompressed and EHCC Compressed format = 1000001 rows
Compression type: "Compress Query High"     Compression ratio (est):16.3
Compression Advisor self-check validation successful. select count(*) on both Uncompressed and EHCC Compressed format = 1000001 rows
Compression type: "Compress Archive Low"     Compression ratio (est):16.6
Compression Advisor self-check validation successful. select count(*) on both Uncompressed and EHCC Compressed format = 1000001 rows
Compression type: "Compress Archive High"     Compression ratio (est):21.7
PL/SQL procedure successfully completed.

--//如果单独执行如下:
--//在sys用户下建立触发器禁止drop表.

CREATE OR REPLACE TRIGGER SYS.TRI_PREVENT_DROP_TRUNCATE
   BEFORE TRUNCATE OR DROP ON DATABASE
BEGIN
   IF ora_dict_obj_type = ‘TABLE‘ AND ora_dict_obj_owner = ‘SCOTT‘ and ORA_DICT_OBJ_NAME not like ‘SYS\_JOURNAL\_%‘ escape ‘\‘
   THEN
      raise_application_error (-20000, ‘YOU CAN NOT TRUNCATE or DROP ‘ || ora_dict_obj_name || ‘ TABLE!‘);
   END IF;
END;
/

--//如果单独执行如下:
/* Formatted on 2018/8/14 8:49:08 (QP5 v5.269.14213.34769) */
set serveroutput on
DECLARE
   blockct_comp     NUMBER;
   blockct_uncomp   NUMBER;
   rows_comp        NUMBER;
   rows_uncomp      NUMBER;
   comp_rat         NUMBER;
   comp_type        VARCHAR2 (40);
BEGIN
DBMS_COMPRESSION.get_compression_ratio
   (
      ‘&&tblspc‘
     ,‘&&ownr‘
     ,‘&&tblname‘
     ,NULL
     ,DBMS_COMPRESSION.comp_archive_high
     ,blockct_comp
     ,blockct_uncomp
     ,rows_comp
     ,rows_uncomp
     ,comp_rat
     ,comp_type
   );
   DBMS_OUTPUT.put_line
   (
         ‘Compression type: ‘
      || comp_type
      || ‘     Compression ratio (est):‘
      || comp_rat
   );
END;
/
--//注:12c参数DBMS_COMPRESSION.comp_archive_high与11g不同.11g写成DBMS_COMPRESSION.comp_for_archive_high
--//由于触发器建立,报错如下:
[email protected]> @ exadata/comp_radio12x.sql
old  11:       ‘&&tblspc‘
new  11:       ‘USERS‘
old  12:      ,‘&&ownr‘
new  12:      ,‘SCOTT‘
old  13:      ,‘&&tblname‘
new  13:      ,‘T‘
Compression Advisor self-check validation successful. select count(*) on both Uncompressed and EHCC Compressed format = 1000001 rows
DECLARE
*
ERROR at line 1:
ORA-20000: YOU CAN NOT TRUNCATE or DROP CMP1$107873 TABLE!
ORA-06512: at line 4
ORA-06512: at "SYS.PRVT_COMPRESSION", line 2134
ORA-06512: at "SYS.PRVT_COMPRESSION", line 1108
ORA-20000: YOU CAN NOT TRUNCATE or DROP CMP1$107873 TABLE!
ORA-06512: at "SYS.PRVT_COMPRESSION", line 237
ORA-06512: at "SYS.DBMS_COMPRESSION", line 215
ORA-06512: at line 9

[email protected]> select owner,object_name,CREATED from dba_objects where owner=user and object_name like ‘CMP%‘;
OWNER                OBJECT_NAME          CREATED
-------------------- -------------------- -------------------
SCOTT                CMP4$107873          2018-08-14 20:58:05
SCOTT                CMP3$107873          2018-08-14 20:57:57
SCOTT                CMP2$107873          2018-08-14 20:57:51
SCOTT                CMP1$107873          2018-08-14 20:57:48

--//这次测试建立4张表.
[email protected]> select * from CMP4$107873;
select * from CMP4$107873
              *
ERROR at line 1:
ORA-64307:  Exadata Hybrid Columnar Compression is not supported for tablespaces on this storage type

--//可以发现oracle建立hcc表在非exadata是可行的,但是里面的数据不能看.

原文地址:https://www.cnblogs.com/lfree/p/9477939.html

时间: 2024-11-09 02:57:21

[20180814]慎用查看表压缩率脚本.txt的相关文章

[转] 使用SQL脚本查看表空间使用率和使用dba_tablespace_usage_metrics视图的区别

传统的SQL脚本查看表空间使用率,使用的关键视DBA_DATA_FILE和DBA_FREE_SPACE.Oracle 11g引入了DBA_TABLESPACE_USAGE_METRICS视图.事实上,Oracle 10g中就已经引入了该视图,可以使用,但在10g官方文档中查不到,11g官方文档对该视图作了说明. Oracle 11g 官方文档中对DBA_TABLESPACE_USAGE_METRICS视图的说明: DBA_TABLESPACE_USAGE_METRICS describes ta

企业Shell实战-MySQL分库分表备份脚本

本文来自http://www.xuliangwei.com/xubusi/252.html 免费视频讲解见 http://edu.51cto.com/course/course_id-5064.html 企业Shell实战-MySQL分库分表备份 今天是2015年的最后一天,大家都开心的跨年,而我还在苦逼的呵呵-省略 此处内容来自老男孩教育oldboy以及老男孩26期王续精彩分享整理而来  为表示感谢,特整理此篇博文分享给大家! 项目联系笔者QQ:572891887   也可以加入架构师交流群:

Oracle 查看表空间大小及其扩展

在ORACLE数据库中,所有数据从逻辑结构上看都是存放在表空间当中,当然表空间下还有段.区.块等逻辑结构.从物理结构上看是放在数据文件中.一个表空间可由多个数据文件组成.系统中默认创建的几个表空间:SYSTEM,SYSAUX,USERS,UNDOTBS1,EXAMPLE,TEMP还有用户自己建立的表空间,可以对其进行分成三类 永久表空间                存放永久性数据,如表,索引等. 临时表空间                不能存放永久性对象,用于保存数据库排序,分组时产生的临时

hive表信息查询:查看表结构、表操作等--转

原文地址:http://www.aboutyun.com/forum.PHP?mod=viewthread&tid=8590&highlight=Hive 问题导读:1.如何查看hive表结构?2.如何查看表结构信息?3.如何查看分区信息?4.哪个命令可以模糊搜索表? 1.hive模糊搜索表  show tables like '*name*'; 2.查看表结构信息  desc formatted table_name;  desc table_name; 3.查看分区信息  show p

(转)企业Shell实战-MySQL分库分表备份脚本

本文来自http://www.xuliangwei.com/xubusi/252.html 免费视频讲解见 http://edu.51cto.com/course/course_id-5064.html 企业Shell实战-MySQL分库分表备份 今天是2015年的最后一天,大家都开心的跨年,而我还在苦逼的呵呵-省略 此处内容来自老男孩教育oldboy以及老男孩26期王续精彩分享整理而来  为表示感谢,特整理此篇博文分享给大家! 项目联系笔者QQ:572891887   也可以加入架构师交流群:

hive表信息查询:查看表结构、表操作等

转自网友的,主要是自己备份下 有时候不记得! 问题导读:1.如何查看hive表结构?2.如何查看表结构信息?3.如何查看分区信息?4.哪个命令可以模糊搜索表 1.hive模糊搜索表 show tables like '*name*'; 2.查看表结构信息  desc formatted table_name;  desc table_name; 3.查看分区信息  show partitions table_name; 4.根据分区查询数据  select table_coulm from ta

javascript高级程序设计 第十四章--表单脚本

javascript高级程序设计 第十四章--表单脚本 在HTML中表单由<form>元素表示,在js中表单对应的是HTMLFormElement类型,这个类型也有很多属性和方法:取得表单元素的引用还是为它添加id特性,用DOM操作来获取表单元素:提交表单:把<input>或<button>元素的type特性设置为"submit",图像按钮把<input>元素的type特性设置为"image",也可以调用submit(

表的操作-建立表-删除表-修改表的名字-修改列的名字及数据类型-删除/添加主键-在表的最后增加一列-查看表的结构

USE db; -- 列出查看当前数据库中的所有表 SHOW TABLES; SHOW TABLES LIKE 's%'; CREATE TABLE 表名 ( 列名 类型 修饰 约束, sid INT(3) UNSIGNED ZEROFILL PRIMARY KEY AUTO_INCREMENT sgender ENUM('男','女','保密') DEFAULT '男' )ENGINE=MYISAM DEFAULT CHARSET=utf8; -- 建立表 CREATE TABLE IF NO

PowerDesigner如何导出建表sql脚本(转)

1 按照数据库类型,切换数据库. Database-> Change Current DBMS... 2 生成sql脚本 Database -> Database Generation 的Preview选项卡 点击保存按钮,保存产生的sql脚本到本地. [注意]: 1 本人使用的powerDesigner是15.2版本. 2 产生出的sql脚本一般会有drop table的语句,这些语句在运行时可以不要,以防报出表不存在的错误. PowerDesigner如何导出建表sql脚本(转),布布扣,