楼主: zcs0237

[原创] 全面解析11GR2中的BTree索引(含视频)

[复制链接]
求职 : 数据库管理员
论坛徽章:
45
祖国60周年纪念徽章
日期:2015-05-19 13:02:04itpub13周年纪念徽章
日期:2014-12-30 09:02:122010数据库技术大会纪念徽章
日期:2015-04-23 10:33:192011数据库大会纪念章
日期:2015-04-23 10:33:192012数据库大会纪念章
日期:2015-04-23 10:33:192013数据库大会纪念章
日期:2015-04-23 10:33:192014数据库大会纪念章
日期:2015-04-23 10:33:192015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24暖羊羊
日期:2015-05-13 18:24:182015年新春福章
日期:2015-05-30 17:02:05
11#
 楼主| 发表于 2013-7-27 22:19 | 只看该作者

第10部分-(t3表)键压缩索引(只压缩索引中的前导列)

本帖最后由 zcs0237 于 2013-8-6 17:13 编辑

列出当前数据库中的键压缩类索引
SYS@zcs11g>  set sqlprompt "_user'@zcs'11g> "
select '--',INDEX_TYPE,index_name from dba_indexes where compression='ENABLED';
--NORMAL                      DR_UNIQ_THS_PHRASE
--IOT - TOP                   MGMT_DB_INIT_PARAMS_ECM_PK
...
90 rows selected.


10.01-索引压缩可以在某种程度上减小索引所占空间、减少叶块数量
索引压缩可以在某种程度上减小索引所占空间,减小扫描索引时候的I/O,提高查询的性能。
一、建表(索引列重复项比较多的时候,可以考虑进行索引压缩)
SYS@ZCS11G>  drop table t3 purge;
create table t3(c1 varchar2(100),c2 varchar2(100),c3 varchar2(100),c4 number);
begin
for i in 1..5000 loop
insert into t3 values(lpad('z',100,'z') ,lpad('c',100,'c'),lpad('s',100,'s'),i);
end loop;
commit;
end;
/
begin
for i in 5001..10000 loop
insert into t3 values(lpad('c',100,'c') ,lpad('s',100,'s'),lpad('z',100,'z'),i);end loop;
commit;
end;
/
begin
for i in 10001..15000 loop
insert into t3 values(lpad('s',100,'s') ,lpad('z',100,'z'),lpad('c',100,'c'),i);
end loop;
commit;
end;
/
set pagesize 0
select '--'||bytes/1024||' KB' from dba_segments where owner='SYS' and segment_name='T3';

--6144 KB
二、无压缩选项时
1、索引占用空间=6144 KB
SYS@ZCS11G>   drop index t3_idx_nozip;
drop index t3_idx_zip;
create index t3_idx_nozip on t3(c1,c2,c3);
select '--'||bytes/1024||' KB' from dba_segments where owner='SYS' and segment_name='T3_IDX_NOZIP';


--6144 KB
2、BLEVEL=3(+叶块=4)
SYS@ZCS11G>   set pagesize 999
select num_rows,blevel,leaf_blocks from user_indexes where index_name='T3_IDX_NOZIP';


--  NUM_ROWS     BLEVEL LEAF_BLOCKS
---------- ---------- -----------
--     15000          3         682
三、压缩前收集统计信息并评估算缩长度
SYS@ZCS11G>   validate index t3_idx_nozip;
select '--',opt_cmpr_count,opt_cmpr_pctsave from index_stats;
--             3               92


--OPT_CMPR_COUNT=3——键最佳压缩长度是3
--OPT_CMPR_PCTSAVE=92——压缩后节省空间的百分比是92%
四、compress——默认认键压缩索引占用空间=256 KB
1、create index … compress
在非唯一索引的情况下,压缩前导列可能是索引中的所有列。
在唯一索引的情况下,压缩前导列可以是索引中除最后一列外的全部列。
SYS@ZCS11G>   drop index t3_idx_nozip;
create index t3_idx_zip on t3(c1,c2,c3) compress;
set pagesize 0;
select '--'||bytes/1024||' KB' from dba_segments where owner='SYS' and segment_name='T3_IDX_ZIP';


--256 KB
2、压缩率确实是跟上面评测的结果很接近
SYS@zcs11g> select '--',ceil((1-256/6144)*100)||'%' from dual;


-- 96%   
3、blevel从3变为1,叶块从92变为25
SYS@ZCS11G>  select num_rows,blevel,leaf_blocks from user_indexes where index_name='T3_IDX_ZIP';


--  NUM_ROWS     BLEVEL LEAF_BLOCKS
---------- ---------- -----------
--     15000          1          25
四、compress  1——非默认键压缩索引,只有一个前导列时占用空间=4096 KB
SYS@ZCS11G>   drop index t3_idx_zip;
create index t3_idx_zip on t3(c1,c2,c3) compress 1;
select '--'||bytes/1024||' KB' from dba_segments where owner='SYS' and segment_name='T3_IDX_ZIP';


--4096 KB
SYS@ZCS11G>   select num_rows,blevel,leaf_blocks from user_indexes where index_name='T3_IDX_ZIP';

--  NUM_ROWS     BLEVEL LEAF_BLOCKS
---------- ---------- -----------
--     15000          2         455


10.02-键压缩原理(暂时没找到带图的oracle压缩算法的文章。。。下面是db2的一篇文章)
摘编:《IBM
孔再华DB2 V9.7 索引压缩原理》
一、未压缩时的索引存储结构
在了解索引压缩的原理之前,我们先了解一下索引是如何存储在数据库中的。
1. 原先的索引页

图 1 显示索引页结构。索引的存储和表数据的存储差不多,也是存放在预先定义了大小的数据页中。
页头。每个索引页都是从页头开始,跟着是 SLOT 目录。
SLOT 目录。在 SLOT 目录中,每两个字节对应此索引页中不同的索引键。标识不同索引键在页面中的起始位置。
索引键和记录标识列表。索引在表上定义时,选择创建索引的表列的子集就是索引键。每个索引项还包含相应记录的逻辑指针(RID),也就是记录标识,指到数据表中数据行的位置。
了解了索引的存储结构,我们可以先想象一下,在索引页中有哪些部分是可以被压缩变小的?压缩之后,同样大小的索引页中能否放入更多的数据?在使用索引时,需要什么样的步骤才能达到原先的效果?
二、记录标识列表压缩算法
在图 1 中已经说明了一条索引是由索引键和对应的记录标识列表组成的。记录标识列表是此键值对应的一些 Record ID(RID)。RID 标识记录在表中的位置。一般由 4 到 8 个字节组成。假设在索引页中,某个索引键对应的 RID 列表是‘ 00,00,00,06 ’‘ 00,00,00,07 ’,它标出了对应的两行记录在表中的位置。其实这是两条相邻的记录,第二条记录与第一条记录的增量是 1. 在 DB2 V9.7 中,索引可以存储相邻记录间增量 1 来替换‘ 00,00,00,07 ’这个 RID。转换后存储为‘ 00,00,00,06 ’‘ 1 ’。与原先的标识相比,几乎减少了一半的空间。如果对图 1 中的索引进行 RID list 压缩,就会得图 3 所示结果 .

3. RID list 压缩后的索引页
与图 1 相比,记录标识列表中存储的数据发生了很大的变化,除了第一条 RID 是存储的完全记录外,其他的都是存储的记录之间的增量。这个增量可以小到甚至只有 1 字节,与原先需要 4 到 8 个字节的 RID 来标识记录相比,压缩程度是非常可观的。
三、索引键前缀压缩算法
因为索引键是存储在索引中的,对于存储在同一页中的索引键,很有可能相邻的索引键的值差别不大。比如部门编号的前几个数字都是相同的,只有最后两位用了不同的代码区分,比如中国员工的姓名,同姓的人很多,区别是名字不一样。这些信息被存储在表中,并被拿来创建索引。在创建索引或者插入索引时,DB2 会对比相邻的索引键的值,获得其中最长的前缀值。当索引页存满后,这些前缀值又会与相邻的前缀值比较得到优化的前缀值。这些优化的前缀值会被提取出来,存放到 Slot directory 之后。

4. 索引键前缀选取


5. 索引键前缀压缩

在图中所显示的案例中,DB2 分别挑选了‘ IBM,CN ’和‘ HP,EN,Zha ’作为可压缩的前缀值,存放在 Slot directory 后,然后用‘ 0,2 ’标记提取位置。与行压缩相比,这些前缀的用法与数据字典用法相似,但是前缀只应用于当前索引页中,而数据字典应用于整张表。

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
45
祖国60周年纪念徽章
日期:2015-05-19 13:02:04itpub13周年纪念徽章
日期:2014-12-30 09:02:122010数据库技术大会纪念徽章
日期:2015-04-23 10:33:192011数据库大会纪念章
日期:2015-04-23 10:33:192012数据库大会纪念章
日期:2015-04-23 10:33:192013数据库大会纪念章
日期:2015-04-23 10:33:192014数据库大会纪念章
日期:2015-04-23 10:33:192015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24暖羊羊
日期:2015-05-13 18:24:182015年新春福章
日期:2015-05-30 17:02:05
12#
 楼主| 发表于 2013-7-27 22:19 | 只看该作者

第11部分-补充:索引的基本维护命令

本帖最后由 zcs0237 于 2013-7-29 18:48 编辑

11.01-索引的创建语法
一、create ...
CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>
      ON <schema>.<table_name>
           (<column_name> | <expression> ASC | DESC,
            <column_name> | <expression> ASC | DESC,...)
     TABLESPACE <tablespace_name>
     STORAGE <storage_settings>
     LOGGING | NOLOGGING
     COMPUTE STATISTICS
     NOCOMPRESS | COMPRESS<nn>
     NOSORT | REVERSE
     PARTITION | GLOBAL PARTITION<partition_setting>
二、相关说明
- UNIQUE | BITMAP:省略为B-Tree索引。
-<column_name> | <expression> ASC | DESC:当为expression时即“基于函数的索引”
-TABLESPACE:为索引指定单独的表空间
-STORAGE:可进一步设置表空间的存储参数
-LOGGING | NOLOGGING:索引用不到REDO LOG
-COMPUTE STATISTICS:创建新索引时收集统计信息
-NOCOMPRESS | COMPRESS<nn>:使用键压缩可以删除一个键列中出现的重复值
-NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值
-PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区

11.02-合并与重建索引
一、删除记录行(分析结果视图:index_stats)
SQL>select '--',OBJECT_NAME from user_objects where object_type='INDEX'

--PK_EMP
--PK_DEPT
--EMP_ENAME
--SQL> delete from tab where id>800;
二、分析索引的逻辑坏损(分析结果视图:index_stats)
SQL> analyze index PK_EMP validate structure;
select HEIGHT,BLOCKS,LF_ROWS,DEL_LF_ROWS from index_stats  where NAME= 'PK_EMP';
    树高      索引块数   记录数   删除记录数
    HEIGHT     BLOCKS    LF_ROWS DEL_LF_ROWS
---------- ---------- ---------- -----------
         1          8         14           0
三、合并索引——合并同一branch的leaf block(不锁表)以消除碎片但不减树高
SQL> alter  index   索引名  coalesce

过程:  扫描索引的叶了节点-> 相邻的块有碎片进行合并
四、重建索引以消除索引碎片、降低树高
删除记录,对应的索引仅仅是做逻辑删除,只有一个block中的全部索引都被标识为逻辑删除,orcle才会真正的回收block, 这时这个block才能被再次利用。当 DEL_LF_ROWS/ LF_ROWS>15%时应进行 索引重建或索引碎片整理。
SQL> alter index ind_name rebuild [online] tablespace tb1;


11.03-索引的可用性管理
一、unusable索引(不能再被使用也不会随着表的更新而更新)   
SQL> create table t1(id int);
create index t1_idx on t1(id);
select '--'||status from dba_indexes where index_name='T1_IDX';

--VALID
SQL> alter index t1_idx unusable;
select '--'||status from dba_indexes where index_name='T1_IDX';

--UNUSABLE
SQL> alter index t1_idx rebuild;
二、invisible索引(11g,使索引不对CBO可见降低直接删除索引或者禁用索引的风险)
SQL> alter index t_test1_idx invisible;
SQL> alter index t1_idx rebuild;
三、disable仅仅只针对函数索引
SQL> alter t2_idx index_name enable;
SQL> alter t2_idx index_name disable;

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
45
祖国60周年纪念徽章
日期:2015-05-19 13:02:04itpub13周年纪念徽章
日期:2014-12-30 09:02:122010数据库技术大会纪念徽章
日期:2015-04-23 10:33:192011数据库大会纪念章
日期:2015-04-23 10:33:192012数据库大会纪念章
日期:2015-04-23 10:33:192013数据库大会纪念章
日期:2015-04-23 10:33:192014数据库大会纪念章
日期:2015-04-23 10:33:192015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24暖羊羊
日期:2015-05-13 18:24:182015年新春福章
日期:2015-05-30 17:02:05
13#
 楼主| 发表于 2013-7-27 22:19 | 只看该作者
本帖最后由 zcs0237 于 2013-8-13 21:40 编辑

--预留位置以便更新、修正

LZ近期文章:
8月13号:表管理知识梳理——普通表的基本优化

分析演示各种监听器配置与加固技术(含视频)
http://www.itpub.net/thread-1804092-1-1.html
10gUNDO的10个实验(含视频)
http://www.itpub.net/thread-1793265-1-1.html
DUMP解读LMT的位图块(含视频)
http://www.itpub.net/thread-1799520-1-1.html
表空间日常管理及核心文件搬迁技术(含视频)
http://www.itpub.net/thread-1796584-1-1.html
深入分析并发控制之——事务隔离与锁机制(含视频)
http://www.itpub.net/thread-1795446-1-1.html
实例恢复相关原理精简总结
http://www.itpub.net/thread-1761630-1-1.html

使用道具 举报

回复
论坛徽章:
4
2013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-09-09 23:08:46ITPUB社区12周年站庆徽章
日期:2013-11-04 09:29:47ITPUB社区12周年站庆徽章
日期:2013-11-13 09:50:46
14#
发表于 2013-7-27 22:38 | 只看该作者
撸主V5。

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
45
祖国60周年纪念徽章
日期:2015-05-19 13:02:04itpub13周年纪念徽章
日期:2014-12-30 09:02:122010数据库技术大会纪念徽章
日期:2015-04-23 10:33:192011数据库大会纪念章
日期:2015-04-23 10:33:192012数据库大会纪念章
日期:2015-04-23 10:33:192013数据库大会纪念章
日期:2015-04-23 10:33:192014数据库大会纪念章
日期:2015-04-23 10:33:192015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24暖羊羊
日期:2015-05-13 18:24:182015年新春福章
日期:2015-05-30 17:02:05
15#
 楼主| 发表于 2013-7-27 22:41 | 只看该作者
string2020 发表于 2013-7-27 22:38
撸主V5。

最先回帖都是高富帅,不用撸

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
16#
发表于 2013-7-27 23:10 | 只看该作者
很详细,很给力,很不错!支持

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
45
祖国60周年纪念徽章
日期:2015-05-19 13:02:04itpub13周年纪念徽章
日期:2014-12-30 09:02:122010数据库技术大会纪念徽章
日期:2015-04-23 10:33:192011数据库大会纪念章
日期:2015-04-23 10:33:192012数据库大会纪念章
日期:2015-04-23 10:33:192013数据库大会纪念章
日期:2015-04-23 10:33:192014数据库大会纪念章
日期:2015-04-23 10:33:192015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24暖羊羊
日期:2015-05-13 18:24:182015年新春福章
日期:2015-05-30 17:02:05
17#
 楼主| 发表于 2013-7-27 23:14 | 只看该作者
本帖最后由 zcs0237 于 2013-7-27 23:22 编辑
guoyJoe 发表于 2013-7-27 23:10
很详细,很给力,很不错!支持


花了n多天,改了n多遍才完成
感谢谢郭大师点评。。。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
18#
发表于 2013-7-28 00:06 | 只看该作者
楼主搞培训的?

使用道具 举报

回复
论坛徽章:
2
2014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02
19#
发表于 2013-7-28 00:10 | 只看该作者
阿范德萨

使用道具 举报

回复
论坛徽章:
23
奥运会纪念徽章:帆船
日期:2013-02-17 16:13:19三菱
日期:2013-10-29 20:28:16现代
日期:2013-10-29 20:28:16三菱
日期:2013-10-29 20:28:16现代
日期:2013-10-29 20:28:16三菱
日期:2013-10-29 20:28:16比亚迪
日期:2014-01-24 16:03:312014年新春福章
日期:2014-02-18 16:49:31马上有钱
日期:2014-02-18 16:49:31喜羊羊
日期:2015-03-04 14:54:42
20#
发表于 2013-7-28 07:45 | 只看该作者
谢谢分享

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表