|
关于SYS用户无法使用insert /*+ append */ 压缩数据,做了如下的测试:
SQL> create tablespace test_assm datafile 'D:\oracle\app\oradata\test\test_assm01.dbf' size 5m autoextend on next 1m extent management local segment space management auto; -- 创建ASSM表空间
表空间已创建。
SQL> create user test identified by test;
用户已创建。
SQL> grant connect,dba to test;
授权成功。
SQL> conn test/test
已连接。
SQL> create table t tablespace test_assm compress as select * from dba_objects where 1=0; --用户TEST,建立在ASSM表空间TEST_ASSM上
表已创建。
SQL> insert /*+ append */ into t select * from dba_objects;
已创建71890行。
SQL> commit;
提交完成。
SQL> exec dbms_stats.gather_table_stats('TEST','T');
PL/SQL 过程已成功完成。
SQL> select pct_free,pct_used,blocks,empty_blocks,compression,compress_for from
2 user_tables where table_name='T';
PCT_FREE PCT_USED BLOCKS EMPTY_BLOCKS COMPRESS COMPRESS_FOR
---------- ---------- ---------- ------------ -------- ------------
0 309 0 ENABLED BASIC --压缩了
SQL> alter table t move;
表已更改。
SQL> exec dbms_stats.gather_table_stats('TEST','T');
PL/SQL 过程已成功完成。
SQL> select pct_free,pct_used,blocks,empty_blocks,compression,compress_for from
2 user_tables where table_name='T';
PCT_FREE PCT_USED BLOCKS EMPTY_BLOCKS COMPRESS COMPRESS_FOR
---------- ---------- ---------- ------------ -------- ------------
0 309 0 ENABLED BASIC
SQL> conn / as sysdba
已连接。
SQL> create tablespace test_manu datafile 'D:\oracle\app\oradata\test\test_manu01.dbf' size 5m autoextend on next 1m extent management local segment space management manual; --建立MSSM表空间
表空间已创建。
SQL> conn test/test
已连接。
SQL> create table t tablespace test_manu compress as select * from dba_objects where 1=0; --用户TEST,建立在MSSM表空间test_manu上
表已创建。
SQL> insert /*+ append */ into t select * from dba_objects;
已创建71890行。
SQL> commit;
提交完成。
SQL> exec dbms_stats.gather_table_stats('TEST','T');
PL/SQL 过程已成功完成。
SQL> select pct_free,pct_used,blocks,empty_blocks,compression,compress_for from
2 user_tables where table_name='T';
PCT_FREE PCT_USED BLOCKS EMPTY_BLOCKS COMPRESS COMPRESS_FOR
---------- ---------- ---------- ------------ -------- ------------
0 40 295 0 ENABLED BASIC --压缩了
SQL> alter table t move;
表已更改。
SQL> exec dbms_stats.gather_table_stats('TEST','T');
PL/SQL 过程已成功完成。
SQL> select pct_free,pct_used,blocks,empty_blocks,compression,compress_for from
2 user_tables where table_name='T';
PCT_FREE PCT_USED BLOCKS EMPTY_BLOCKS COMPRESS COMPRESS_FOR
---------- ---------- ---------- ------------ -------- ------------
0 40 295 0 ENABLED BASIC
SQL> conn / as sysdba
已连接。
SQL> create table t tablespace test_manu compress as select * from dba_objects where 1=0; --SYSTEM用户,建立在MSSM表空间TEST_MANU上
表已创建。
SQL> insert /*+ append */ into t select * from dba_objects;
已创建71891行。
SQL> commit;
提交完成。
SQL> exec dbms_stats.gather_table_stats('SYS','T');
PL/SQL 过程已成功完成。
SQL> select pct_free,pct_used,blocks,empty_blocks,compression,compress_for from
2 user_tables where table_name='T';
PCT_FREE PCT_USED BLOCKS EMPTY_BLOCKS COMPRESS COMPRESS_FOR
---------- ---------- ---------- ------------ -------- ------------
0 40 295 0 ENABLED BASIC
SQL> create table t tablespace test_assm compress as select * from dba_objects where 1=0; --SYSTEM用户,建立在ASSM表空间TEST_ASSM上
表已创建。
SQL> insert /*+ append */ into t select * from dba_objects;
已创建71891行。
SQL> commit;
提交完成。
SQL> exec dbms_stats.gather_table_stats('SYS','T');
PL/SQL 过程已成功完成。
SQL> select pct_free,pct_used,blocks,empty_blocks,compression,compress_for from
2 user_tables where table_name='T';
PCT_FREE PCT_USED BLOCKS EMPTY_BLOCKS COMPRESS COMPRESS_FOR
---------- ---------- ---------- ------------ -------- ------------
0 309 0 ENABLED BASIC
SQL> create table t tablespace system compress as select * from dba_objects where 1=0; --SYSTEM用户,建立在MSSM表空间SYSTEM上
表已创建。
SQL> insert /*+ append */ into t select * from dba_objects;
已创建71891行。
SQL> commit;
提交完成。
SQL> exec dbms_stats.gather_table_stats('SYS','T');
PL/SQL 过程已成功完成。
SQL> select pct_free,pct_used,blocks,empty_blocks,compression,compress_for from
2 user_tables where table_name='T';
PCT_FREE PCT_USED BLOCKS EMPTY_BLOCKS COMPRESS COMPRESS_FOR
---------- ---------- ---------- ------------ -------- ------------
0 40 919 0 ENABLED BASIC --没有压缩
SQL> conn test/test
已连接。
SQL> drop table t;
表已删除。
SQL> create table t tablespace system compress as select * from dba_objects where 1=0; --TEST用户,建立在MSSM表空间SYSTEM上
表已创建。
SQL> insert /*+ append */ into t select * from dba_objects;
已创建71891行。
SQL> commit;
提交完成。
SQL> exec dbms_stats.gather_table_stats('TEST','T');
PL/SQL 过程已成功完成。
SQL> select pct_free,pct_used,blocks,empty_blocks,compression,compress_for from
2 user_tables where table_name='T';
PCT_FREE PCT_USED BLOCKS EMPTY_BLOCKS COMPRESS COMPRESS_FOR
---------- ---------- ---------- ------------ -------- ------------
0 40 295 0 ENABLED BASIC --压缩了
SQL> select tablespace_name,segment_space_management,compress_for from dba_table
spaces;
TABLESPACE_NAME SEGMEN COMPRESS_FOR
------------------------------ ------ ------------------------
SYSTEM MANUAL
SYSAUX AUTO
UNDOTBS1 MANUAL
TEMP MANUAL
USERS AUTO
TEST_ASSM AUTO
TEST_MANU MANUAL
已选择7行。
结论:对于sys用户,如果表建立在SYSTEM表空间上,则无法通过insert /*+ append */直接路径插入来压缩数据。除此之外,sys用户建立在其他表空间,以及其他用户建立在任何表空间的压缩表都可以通过insert /*+ append */ 直接路径插入来压缩数据。换句话说,与ASSM,MSSM没有关系。
不知道这是不是个BUG?反正文档里没有说SYS用户与其他用户有区别。
[ 本帖最后由 sundog315 于 2010-4-12 20:18 编辑 ] |
|