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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7551038/viewspace-617360/