欢迎投稿

今日深度:

重建整合索引方法-对比测试

重建整合索引方法-对比测试


重建整合索引方法-对比测试
 
创建测试表
 
SQL> create table t1 as select rownum a,rpad('A',20,'B')  b  from dual connect by level<100000;
 
表已创建。
 
SQL> select count(*) from t1;
 
  COUNT(*)                                                                                                                  
----------                                                                                                              
     99999                                                              
SQL> create index ind_t1 on t1(a,b);
 
索引已创建。
 
SQL> analyze index ind_t1 validate structure;
 
索引已分析
 
SQL> select height,blocks,lf_blks,lf_rows_len,lf_blk_len,br_blks,br_rows,
  2  br_rows_len,br_blk_len,btree_space,used_space,pct_used from index_stats;
 
    HEIGHT     BLOCKS    LF_BLKS LF_ROWS_LEN LF_BLK_LEN    BR_BLKS    BR_ROWS BR_ROWS_LEN BR_BLK_LEN BTREE_SPACE        
---------- ---------- ---------- ----------- ---------- ---------- ---------- ----------- ---------- -----------        
USED_SPACE   PCT_USED                                                                                                   
---------- ----------                                                                                                   
         2        640        515     3688857       8000          1        514        6117       8032     4128032        
   3694974         90                                                                                                   
                                                                                                                        
删除1/3行
SQL> delete t1 where mod(a,3)=1;
 
已删除33333行。
 
SQL> commit;
 
提交完成。
 
查看redo情况
SQL> select vs.name,ms.value from v$mystat ms,v$sysstat vs where ms.statistic#=vs.statistic# and vs.name in ('redo size','consistent gets');
 
NAME                                                                  VALUE                                             
---------------------------------------------------------------- ----------                                             
consistent gets                                                        3485                                             
redo size                                                          20580416                                             
 
SQL> alter index ind_t1 coalesce;
 
索引已更改。
 
SQL> select vs.name,ms.value from v$mystat ms,v$sysstat vs where ms.statistic#=vs.statistic# and vs.name in ('redo size','consistent gets');
 
NAME                                                                  VALUE                                             
---------------------------------------------------------------- ----------                                             
consistent gets                                                        3501                                             
redo size                                                         27632084       
 
coalesce=27632084-20580416 产生约6.7m redo                                    
 
SQL> analyze index ind_t1 validate structure;
 
索引已分析
 
SQL> select height,blocks,lf_blks,lf_rows_len,lf_blk_len,br_blks,br_rows,
  2  br_rows_len,br_blk_len,btree_space,used_space,pct_used from index_stats;
 
    HEIGHT     BLOCKS    LF_BLKS LF_ROWS_LEN LF_BLK_LEN    BR_BLKS    BR_ROWS BR_ROWS_LEN BR_BLK_LEN BTREE_SPACE        
---------- ---------- ---------- ----------- ---------- ---------- ---------- ----------- ---------- -----------        
USED_SPACE   PCT_USED                                                                                                   
---------- ----------                                                                                                   
         2        640        343     2459238       8000          1        342        4067       8032     2752032        
   2463305         90                                                                                                   
 
索引的blocks总数没有变但是叶子块由515变为343,减少了172。btree_space变小了,这个应该是索引的真实数据占用的空间,而block是为索引分配的空间。                                                                                                                        
 
SQL> alter index ind_t1 shrink space;
 
索引已更改。
 
SQL> analyze index ind_t1 validate structure;
 
索引已分析
 
SQL> select height,blocks,lf_blks,lf_rows_len,lf_blk_len,br_blks,br_rows,
  2  br_rows_len,br_blk_len,btree_space,used_space,pct_used from index_stats;
 
    HEIGHT     BLOCKS    LF_BLKS LF_ROWS_LEN LF_BLK_LEN    BR_BLKS    BR_ROWS BR_ROWS_LEN BR_BLK_LEN BTREE_SPACE        
---------- ---------- ---------- ----------- ---------- ---------- ---------- ----------- ---------- -----------        
USED_SPACE   PCT_USED                                                                                                   
---------- ----------                                                                                                   
         2        360        343     2459238       8000          1        342        4067       8032     2752032        
   2463305         90                                                                                                   
 
shrink space使blocks变小,真正释放了空间                                                              
新创建一个测试表
SQL> create table t2 as select rownum a,rpad('A',20,'B') b from dual connect by level<100000;
 
表已创建。
 
SQL> create index ind_t2 on t2(a,b);
 
索引已创建。
 
SQL> analyze index ind_t2 validate structure;
 
索引已分析
 
SQL> select height,blocks,lf_blks,lf_rows_len,lf_blk_len,br_blks,br_rows,
  2  br_rows_len,br_blk_len,btree_space,used_space,pct_used from index_stats;
 
    HEIGHT     BLOCKS    LF_BLKS LF_ROWS_LEN LF_BLK_LEN    BR_BLKS    BR_ROWS BR_ROWS_LEN BR_BLK_LEN BTREE_SPACE        
---------- ---------- ---------- ----------- ---------- ---------- ---------- ----------- ---------- -----------        
USED_SPACE   PCT_USED                                                                                                   
---------- ----------                                                                                                   
         2        640        515     3688857       8000          1        514        6117       8032     4128032        
   3694974         90                                                   
 
SQL> delete from t2 where mod(a,3)=1;
 
已删除33333行。
 
SQL> commit;
 
提交完成。
 
SQL> analyze index ind_t2 validate structure;
 
索引已分析
 
SQL> select height,blocks,lf_blks,lf_rows_len,lf_blk_len,br_blks,br_rows,
  2  br_rows_len,br_blk_len,btree_space,used_space,pct_used from index_stats;
 
    HEIGHT     BLOCKS    LF_BLKS LF_ROWS_LEN LF_BLK_LEN    BR_BLKS    BR_ROWS BR_ROWS_LEN BR_BLK_LEN BTREE_SPACE        
---------- ---------- ---------- ----------- ---------- ---------- ---------- ----------- ---------- -----------        
USED_SPACE   PCT_USED                                                                                                   
---------- ----------                                                                                                   
         2        640        515     3688857       8000          1        514        6117       8032     4128032        
   3694974         90                                                                                                   
只是进行delete后做分析,统计出信息并没有变化                                                    
SQL> select vs.name,ms.value from v$mystat ms,v$sysstat vs where ms.statistic#=vs.statistic# and vs.name in ('redo size','consistent gets');
 
NAME                                                                  VALUE                                             
---------------------------------------------------------------- ----------                                             
consistent gets                                                        9715                                             
redo size                                                          50275964                                             
 
SQL> alter index ind_t2 shrink space compact;
 
索引已更改。
 
SQL> select vs.name,ms.value from v$mystat ms,v$sysstat vs where ms.statistic#=vs.statistic# and vs.name in ('redo size','consistent gets');
 
NAME                                                                  VALUE                                             
---------------------------------------------------------------- ----------                                             
consistent gets                                                       10022                                             
redo size                                                          59333252       
 
shrink space compact产生redo为59333252-50275964,约为8.6m
 
                                      
 
SQL> analyze index ind_t2 validate structure;
 
索引已分析
 
SQL> select height,blocks,lf_blks,lf_rows_len,lf_blk_len,br_blks,br_rows,
  2  br_rows_len,br_blk_len,btree_space,used_space,pct_used from index_stats;
 
    HEIGHT     BLOCKS    LF_BLKS LF_ROWS_LEN LF_BLK_LEN    BR_BLKS    BR_ROWS BR_ROWS_LEN BR_BLK_LEN BTREE_SPACE        
---------- ---------- ---------- ----------- ---------- ---------- ---------- ----------- ---------- -----------        
USED_SPACE   PCT_USED                                                                                                   
---------- ----------                                                                                                   
         2        640        343     2459238       8000          1        342        4067       8032     2752032        
   2463305         90                                                                                                   
   
此时blocks大小并没有变化,只是叶子块减少与coalesce一样多                                                                                                                       
 
SQL> alter index ind_t2 shrink space;
 
索引已更改。
 
SQL> analyze index ind_t2 validate structure;
 
索引已分析
 
SQL> select vs.name,ms.value from v$mystat ms,v$sysstat vs where ms.statistic#=vs.statistic# and vs.name in ('redo size','consistent gets');
 
NAME                                                                  VALUE                                             
---------------------------------------------------------------- ----------                                             
consistent gets                                                       11580                                             
redo size                                                          59393732            
 
继续做shrink space几乎没有产生redo
                                 
 
SQL> select height,blocks,lf_blks,lf_rows_len,lf_blk_len,br_blks,br_rows,
  2  br_rows_len,br_blk_len,btree_space,used_space,pct_used from index_stats;
 
    HEIGHT     BLOCKS    LF_BLKS LF_ROWS_LEN LF_BLK_LEN    BR_BLKS    BR_ROWS BR_ROWS_LEN BR_BLK_LEN BTREE_SPACE        
---------- ---------- ---------- ----------- ---------- ---------- ---------- ----------- ---------- -----------        
USED_SPACE   PCT_USED                                                                                                   
---------- ----------                                                                                                   
         2        360        343     2459238       8000          1        342        4067       8032     2752032        
   2463305         90                                                                                                   
                                                                                                                        
blocks 大小变小了哦
 
总结:coalesce与shrink space compact效果大致相同,只是多产生了一点redo信息,没有真正释放出空间。而shrink space会真正释放空间。
 
 
接下来看一下重建索引
SQL> create table t3 as select rownum id,rpad('A',20,'B') name from dual connect
 by level<100000;
 
表已创建。
 
SQL> create index ind_t3 on t3(id ,name);
 
索引已创建。
 
SQL> analyze index ind_t3 validate structure;
 
索引已分析
 
SQL> select height,blocks,lf_blks,lf_rows_len,lf_blk_len,br_blks,br_rows,
  2  br_rows_len,br_blk_len,btree_space,used_space,pct_used from index_stats;
 
    HEIGHT     BLOCKS    LF_BLKS LF_ROWS_LEN LF_BLK_LEN    BR_BLKS    BR_ROWS BR
_ROWS_LEN BR_BLK_LEN BTREE_SPACE
---------- ---------- ---------- ----------- ---------- ---------- ---------- --
--------- ---------- -----------
USED_SPACE   PCT_USED
---------- ----------
         2        640        515     3688857       8000          1        514
     6117       8032     4128032
   3694974         90
 
 
SQL> delete t3 where mod(id,3)=1;
 
已删除33333行。
 
SQL> analyze index ind_t3 validate structure;
 
索引已分析
 
SQL> select height,blocks,lf_blks,lf_rows_len,lf_blk_len,br_blks,br_rows,
  2  br_rows_len,br_blk_len,btree_space,used_space,pct_used from index_stats;
 
    HEIGHT     BLOCKS    LF_BLKS LF_ROWS_LEN LF_BLK_LEN    BR_BLKS    BR_ROWS BR
_ROWS_LEN BR_BLK_LEN BTREE_SPACE
---------- ---------- ---------- ----------- ---------- ---------- ---------- --
--------- ---------- -----------
USED_SPACE   PCT_USED
---------- ----------
         2        640        515     3688857       8000          1        514
     6117       8032     4128032
   3694974         90
 
 
SQL> select vs.name,ms.value from v$mystat ms,v$sysstat vs where ms.statistic#=v
s.statistic# and vs.name in ('redo size','consistent gets');
 
NAME                                                                  VALUE
---------------------------------------------------------------- ----------
consistent gets                                                       15210
redo size                                                          79973788
 
SQL> alter index ind_t3 rebuild;
 
索引已更改。
 
SQL> analyze index ind_t3 validate structure;
 
索引已分析
 
SQL> select height,blocks,lf_blks,lf_rows_len,lf_blk_len,br_blks,br_rows,
  2  br_rows_len,br_blk_len,btree_space,used_space,pct_used from index_stats;
 
    HEIGHT     BLOCKS    LF_BLKS LF_ROWS_LEN LF_BLK_LEN    BR_BLKS    BR_ROWS BR
_ROWS_LEN BR_BLK_LEN BTREE_SPACE
---------- ---------- ---------- ----------- ---------- ---------- ---------- --
--------- ---------- -----------
USED_SPACE   PCT_USED
---------- ----------
         2        384        343     2459238       8000          1        342
     4067       8032     2752032
   2463305         90
 
 
SQL> select vs.name,ms.value from v$mystat ms,v$sysstat vs where ms.statistic#=v
s.statistic# and vs.name in ('redo size','consistent gets');
 
NAME                                                                  VALUE
---------------------------------------------------------------- ----------
consistent gets                                                       16656
redo size                                                          82859236
 
SQL>
 
redo产生很少但是用了更多地consistent gets,因为他用的是先drop再create
 
这种rebuild会堵塞dml操作,
 
如果使用rebuild online则不会堵塞dml,但是对性能影响会更大一些。

www.htsjk.Com true http://www.htsjk.com/oracle/21292.html NewsArticle 重建整合索引方法-对比测试 重建整合索引方法-对比测试 创建测试表 SQL create table t1 as select rownum a,rpad(A,20,B) b from dual connect by level100000; 表已创建。 SQL select count(*) from t1; COUNT(*) ------...
相关文章
    暂无相关文章
评论暂时关闭