ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 索引压缩研究(一)

索引压缩研究(一)

原创 Linux操作系统 作者:279531451 时间:2009-10-24 22:43:01 0 删除 编辑

1. 索引的类型
   a. B*Tree 索引   (索引组织表,B*Tree 聚族索引,反向码索引)  是一种常用的索引。根据码提供对个单个行或者一系列行的快速访问。通常需要很少的读取就能正确的找到行。索引条目和行之间有一对一的关系
   索引可以压缩、叶块都应该在同一层上、索引的高度大部分是2或者3 上百万条的记录通常需要2次或者3次就可以访问到、
   b. 降序索引
   c. 位图索引  (通常访问数据只有很少的几个截然不同的值) 一个索引条目使用一个位图同时指向许多行。
   d. 基于函数的索引 在行,列中存储函数计算结果(不是列本身),由于function(Database_Column)的值已经计算并且存储在索引中了。
下面看一下,压缩索引和不压缩索引使用的空间大小

创建下面的过程,用来显示对象占用的详细空间

create or replace procedure show_space
( p_segname in varchar2,
p_owner in varchar2 default user,
p_type in varchar2 default 'TABLE',
p_partition in varchar2 default NULL )
as
l_free_blks number;
 l_total_blocks number;
 l_total_bytes number;
 l_unused_blocks number;
 l_unused_bytes number;
 l_LastUsedExtFileId number;
 l_LastUsedExtBlockId number;
 l_last_used_block number;
 procedure p( p_label in varchar2, p_num in number )
 is
 begin
 dbms_output.put_line( rpad(p_label,40,'.') ||
 p_num );
 end;
 begin
 dbms_space.free_blocks
 ( segment_owner => p_owner,
 segment_name => p_segname,
 segment_type => p_type,
 partition_name => p_partition,
 freelist_group_id => 0,
 free_blks => l_free_blks );
dbms_space.unused_space
( segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
partition_name => p_partition,
total_blocks => l_total_blocks,
total_bytes => l_total_bytes,
unused_blocks => l_unused_blocks,
unused_bytes => l_unused_bytes,
last_used_extent_file_id => l_LastUsedExtFileId,
last_used_extent_block_id => l_LastUsedExtBlockId,
last_used_block => l_last_used_block );
p( 'Free Blocks', l_free_blks );
p( 'Total Blocks', l_total_blocks );
p( 'Total Bytes', l_total_bytes );
p( 'Unused Blocks', l_unused_blocks );
p( 'Unused Bytes', l_unused_bytes );
p( 'Last Used Ext FileId', l_LastUsedExtFileId );
p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );
p( 'Last Used Block', l_last_used_block );
end;
/

SQL> /

过程已创建。

SQL> drop table t;

表已删除。

SQL> create table t as select * from all_objects;

表已创建。

SQL> create index t_idx on t (owner ,object_type,object_name);
create index t_idx on t (owner ,object_type,object_name)
             *
第 1 行出现错误:
ORA-00955: 名称已由现有对象使用


SQL> create index t_idx_1 on t (owner ,object_type,object_name);

索引已创建。

SQL> create index t_idx on t (owner ,object_type,object_name);
create index t_idx on t (owner ,object_type,object_name)
             *
第 1 行出现错误:
ORA-00955: 名称已由现有对象使用


SQL> create index t_idx_1 on t (owner ,object_type,object_name);

索引已创建。

SQL> set serveroutput on
SQL> exec show_space('T_IDX_1', user, 'INDEX');
BEGIN show_space('T_IDX_1', user, 'INDEX'); END;

*
第 1 行出现错误:
ORA-10618: Operation not allowed on this segment
ORA-06512: 在 "SYS.DBMS_SPACE", line 167
ORA-06512: 在 "HR.SHOW_SPACE", line 22
ORA-06512: 在 line 1

测试中出现ORA-10618:的错误。只是由于oracle10g以后,默认表空间的段管理是自动的。

解决办法:在手动的段管理的表空间进行测试

SQL> create table t as select * from all_objects;
create table t as select * from all_objects
             *
第 1 行出现错误:
ORA-00955: 名称已由现有对象使用


SQL> drop table t;

表已删除。

SQL> create table t as select * from all_objects;

表已创建。

SQL> create table t_idx_2 on t(owner,object_type,object_name);
create table t_idx_2 on t(owner,object_type,object_name)
                     *
第 1 行出现错误:
ORA-00922: 选项缺失或无效


SQL> create index t_idx_2 on t(owner,object_type,object_name);

索引已创建。

SQL> exec show_space('T_IDX_2',USER,'INDEX');

PL/SQL 过程已成功完成。

SQL> set serveroutput on
SQL> /
create index t_idx_2 on t(owner,object_type,object_name)
             *
第 1 行出现错误:
ORA-00955: 名称已由现有对象使用


SQL> exec show_space('T_IDX_2',USER,'INDEX');
Free Blocks.............................0
Total Blocks............................512
Total Bytes.............................4194304
Unused Blocks...........................8
Unused Bytes............................65536
Last Used Ext FileId....................6
Last Used Ext BlockId...................1920
Last Used Block.........................120

PL/SQL 过程已成功完成。

占用512个块,只有8个块是空闲的。504个块都被使用,可想索引项有很多是重复的,所有的名字在每个块上都出现一次。

下面使用压缩索引

创建压缩索引

SQL> drop index t_idx_2;

索引已删除。

SQL> create index t_idx_2 on t (owner,object_type,object_name) compress 1;

索引已创建。

SQL> exec show_space('T_IDX_2',USER,'INDEX');
Free Blocks.............................0
Total Blocks............................512
Total Bytes.............................4194304
Unused Blocks...........................65
Unused Bytes............................532480
Last Used Ext FileId....................6
Last Used Ext BlockId...................1920
Last Used Block.........................63

PL/SQL 过程已成功完成。

比较发现,总块数512是一样的,未用块为65块,显然比上次多57块。使用了447块,降低了大约10%

如果是海量数据表的化,可以使用压缩索引

明天继续。。。。。。。。。。。。。

 

SQL>

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7551038/viewspace-617360/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-09-01

  • 博文量
    100
  • 访问量
    154614