博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle 降低高水位线的方法
阅读量:6850 次
发布时间:2019-06-26

本文共 6941 字,大约阅读时间需要 23 分钟。

Oracle  降低高水位线的方法 



高水位(HIGH WARTER MARK,HWM)好比水库中储水的水位,用于描述数据库中段的扩展方式。高水位对全表扫描方式有着至关重要的影响。当使用DELETE删除表记录时,高水位并不会下降,随之导致的是全表扫描的实际开销并没有任何减少。

例如,首先新建一张空表,大小占用64K,然后插入数据直到表大小变为50G,此时使用DELETE删除所有的数据并且提交,这个时候查询表的大小的时候依然是50G,这就是因为表的高水位没有释放的缘故,而在这时如果使用“SELECT * FROM TABLE_NAME;”语句来查询数据的话,那么查询过程就会很慢,因为Oracle要执行全表扫描,从高水位下所有的块都得去扫描,直到50G的所有块全部扫描完毕。曾遇到一个同事使用DELETE删除了一个很大的分区表,然后执行SELECT查询很久都没有结果,以为是数据库HANG住了,其实这个问题是由于高水位的缘故。所以,表执行了TRUNCATE操作,再次SELECT的时候就可以很快返回结果了。

释放表的高水位通常有如下几种办法:

(1)对表进行MOVE操作:ALTER TABLE TABLE_NAME MOVE;。若表上存在索引,则记得重建索引。

(2)对表进行SHRINK SPACE操作:ALTER TABLE TABLE_NAME SHRINK SPACE;,注意,在执行该指令之前必须开启行移动:ALTER TABLE TABLE_NAME ENABLE ROW MOVEMENT;。该方法的优点是:在碎片整理结束后,表上相关的索引仍然有效,缺点是会产生大量的UNDOREDO

(3)复制要保留的数据到临时表T,DROP原表,然后RENAME临时表T为原表。

(4)exp/imp或expdp/impdp重构表。

(5)若表中没有数据则直接使用TRUNCATE来释放高水位。

如何找出系统中哪些表拥有高水位呢?这里给出两种办法,①比较表的行数和表的大小关系。如果行数为0,而表的当前占用大小减去初始化时的大小(INITIAL_EXTENT)后依然很大,那么说明该表有高水位。②行数和块数的比率,即查看一个块可以存储多少行数据。如果一个块存储的行数少于5行甚至更少,那么说明有高水位。注意,这两种方法都不是十分准确,需要再对查询结果进行筛选。需要注意的是,在查询表的高水位时,首先需要分析表,以得到最准确的统计信息。

下面给出用于查询高水位的几个SQL语句:

SELECT D.OWNER,

       ROUND(D.NUM_ROWS / D.BLOCKS, 2),

       D.NUM_ROWS,

       D.BLOCKS,

       D.TABLE_NAME,

 ROUND((d.BLOCKS*8-D.INITIAL_EXTENT/1024)/1024)  t_size

  FROM DBA_TABLES D

 WHERE D.BLOCKS > 10

   AND ROUND(D.NUM_ROWS / D.BLOCKS, 2) < 5

 AND d.OWNER NOT LIKE '%SYS%' ;

或:

SELECT OWNER,

       SEGMENT_NAME TABLE_NAME,

       SEGMENT_TYPE,

       GREATEST(ROUND(100 * (NVL(HWM - AVG_USED_BLOCKS, 0) /

                      GREATEST(NVL(HWM, 1), 1)),

                      2),

                0) WASTE_PER

  FROM (SELECT A.OWNER OWNER,

               A.SEGMENT_NAME,

               A.SEGMENT_TYPE,

               B.LAST_ANALYZED,

               A.BYTES,

               B.NUM_ROWS,

               A.BLOCKS BLOCKS,

               B.EMPTY_BLOCKS EMPTY_BLOCKS,

               A.BLOCKS - B.EMPTY_BLOCKS - 1 HWM,

               DECODE(ROUND((B.AVG_ROW_LEN * NUM_ROWS *

                            (1 + (PCT_FREE / 100))) / C.BLOCKSIZE,

                            0),

                      0,

                      1,

                      ROUND((B.AVG_ROW_LEN * NUM_ROWS *

                            (1 + (PCT_FREE / 100))) / C.BLOCKSIZE,

                            0)) + 2 AVG_USED_BLOCKS,

               ROUND(100 *

                     (NVL(B.CHAIN_CNT, 0) / GREATEST(NVL(B.NUM_ROWS, 1), 1)),

                     2) CHAIN_PER,

               B.TABLESPACE_NAME O_TABLESPACE_NAME

          FROM SYS.DBA_SEGMENTS A, SYS.DBA_TABLES B, SYS.TS$ C

         WHERE A.OWNER = B.OWNER

           AND SEGMENT_NAME = TABLE_NAME

           AND SEGMENT_TYPE = 'TABLE'

           AND B.TABLESPACE_NAME = C.NAME)

 WHERE GREATEST(ROUND(100 * (NVL(HWM - AVG_USED_BLOCKS, 0) /

                      GREATEST(NVL(HWM, 1), 1)),

                      2),

                0) > 50

   AND OWNER NOT LIKE '%SYS%'

   AND BLOCKS > 100

 ORDER BY WASTE_PER DESC;

最后再次提醒各位读者,若表执行了大量的DELETE操作后,则最好回收一下表的高水位。



http://docs.oracle.com/cd/E11882_01/server.112/e40540/logical.htm#CNCPT89022

Segment Space and the High Water Mark

To manage space, Oracle Database tracks the state of blocks in the segment. The high water mark (HWM) is the point in a segment beyond which data blocks are unformatted and have never been used.

MSSM uses free lists to manage segment space. At table creation, no blocks in the segment are formatted. When a session first inserts rows into the table, the database searches the free list for usable blocks. If the database finds no usable blocks, then it preformats a group of blocks, places them on the free list, and begins inserting data into the blocks. In MSSM, a full table scan reads allblocks below the HWM.

ASSM does not use free lists and so must manage space differently. When a session first inserts data into a table, the database formats a single bitmap block instead of preformatting a group of blocks as in MSSM. The bitmap tracks the state of blocks in the segment, taking the place of the free list. The database uses the bitmap to find free blocks and then formats each block before filling it with data. ASSM spread out inserts among blocks to avoid concurrency issues.

Every data block in an ASSM segment is in one of the following states:

  • Above the HWM

    These blocks are unformatted and have never been used.

  • Below the HWM

    These blocks are in one of the following states:

    • Allocated, but currently unformatted and unused

    • Formatted and contain data

    • Formatted and empty because the data was deleted

 depicts an ASSM segment as a horizontal series of blocks. At table creation, the HWM is at the beginning of the segment on the left. Because no data has been inserted yet, all blocks in the segment are unformatted and never used.

Figure 12-23 HWM at Table Creation

De.ion of Figure 12-23 follows


段空间和高水位标记

oracle数据库通过跟踪段中的块状态来管理空间。高水位标记(HWM)是段中的一个点,超过该点的数据块是未格式化和未使用过的。

MSSM使用空闲列表来管理段空间。在创建表时,段中的块并未被格式化。当一个会话初次向表中插入行时,数据库将搜索空闲列表来查找可用的块。如果数据库未找到可用的块,那么它会预格式化一组块,并将它们放置在空闲列表中,并开始将数据插入到块中。在MSSM中,全表扫描会读取HWM之下的所有块。

ASSM不使用空闲列表,所以必须以不同的方式管理空间。当会话初次向表中插入数据时,数据库只格式化一个单一位图块,而不像在MSSM中那样预格式化一组块。位图取代了空闲列表,用于跟踪在段中的块的状态。数据库使用位图来查找可用的块,然后在往块写入数据之前将其格式化。ASSM将插入操作分散到多个块,以避免并发问题。

在一个ASSM段中的每个数据块处于以下状态之一:

HWM之上

    这些块是未格式化的,且从未使用过。

HWM之下

这些块处于以下状态之一:

已分配,但当前未格式化且未使用

已格式化且包含数据

已格式化且为空,因为数据已被删除

12-23将一个ASSM段描述为一系列水平的块。在创建表时,HWM在左侧段的开头。因为还未插入数据,段中的所有块都还是未格式化且从未使用过。

图将12-23在创建表时的HWM


Suppose that a transaction inserts rows into the segment. The database must allocate a group of blocks to hold the rows. The allocated blocks fall below the HWM. The database formats a bitmap block in this group to hold the metadata, but does not preformat the remaining blocks in the group.

In , the blocks below the HWM are allocated, whereas blocks above the HWM are neither allocated or formatted. As inserts occur, the database can write to any block with available space. The low high water mark (low HWM) marks the point below which all blocks are known to be formatted because they either contain data or formerly contained data.

Figure 12-24 HWM and Low HWM

De.ion of Figure 12-24 follows



In , the database chooses a block between the HWM and low HWM and writes to it. The database could have just as easily chosen any other block between the HWM and low HWM, or any block below the low HWM that had available space. In , the blocks to either side of the newly filled block are unformatted.

Figure 12-25 HWM and Low HWM

De.ion of Figure 12-25 follows



The low HWM is important in a . Because blocks below the HWM are formatted only when used, some blocks could be unformatted, as in . For this reason, the database reads the bitmap block to obtain the location of the low HWM. The database reads all blocks up to the low HWM because they are known to be formatted, and then carefully reads only the formatted blocks between the low HWM and the HWM.

Assume that a new transaction inserts rows into the table, but the bitmap indicates that insufficient free space exists under the HWM. In , the database advances the HWM to the right, allocating a new group of unformatted blocks.

Figure 12-26 Advancing HWM and Low HWM

De.ion of Figure 12-26 follows



When the blocks between the HWM and low HWM are full, the HWM advances to the right and the low HWM advances to the location of the old HWM. As the database inserts data over time, the HWM continues to advance to the right, with the low HWM always trailing behind it. Unless you manually rebuild, truncate, or shrink the object, the HWM never retreats.

  •  

  •    




  
   
     
   

    
     
      
  
  





    

   




>

  

  

  

  

  

  




                    


                                   


>



>



>



>



                    


                                     



>  

  

  

  

  

  

  



>



>

                    


                                   


>



>






>



>



>



>

                    


                                     



>

  

  

  

  

  

  



>



>

                    


                                   


>



>



>

                    


                                     

>
  
  
  
  
  
  
>
>
>
                    
                                   
>
>
>
>
>
                    
                                     
>
  
  
  
  
  
  
                              
                                          
>
>
>
                              
                                         
>
>
                              
                                          
>
>
>
                              
                                          
    

    

    

 
 
 
  1.   
  2.   
  3.      
  4.   
  5.            
  6.    
  7.             
  8.   
  9.   
  10.   
  11.          
  12.   
  13.    
  14.    
  15.                       
  16.   
  17.   
  18.   
  19.      
  20.   
  21.    
  22.   
  23.         
  24.   
  25.    

    

 
 
 
  1.     
  2.   
  3.                           
  4.                                
  5.                              
  6.        
  7.     
  8.        
  9.                    
  10.   
  11.      
  12.                           
  13.        
  14.     
  15.        
  16.          
  17.          
  18.   
  19.                  
  20.        
  21.        
  22.        
  23.        
  24.        
  25.        
  26.                     
  27.     
  28.    
  29.   
  30.       
  31.   
  32.    
  33.   
  34.                   
  35.   
  36.   
  37.        
  38.    
  39.        
  40.   
  41.              


 
 
 
  1.   
  2.   
  3.     
  4.      
  5.   
  6.   
  7.    
  8.   
  9.      
  10.   
  11.   
  12.                               
  13.   
  14.                                      
  15.                                     
  16.   
  17.   
  18.   
  19.   
  20.            
  21.   
  22.   
  23.   
  24.   
  25.                
  26.                 
  27.                   
  28.                
  29.                
  30.                  
  31.                  
  32.                  
  33.                
  34.                
  35.                

    

 
 
 
  1.        
  2.   
  3.              
  4.     
  5.                              

    
      
    

 
 
 
  1.      
  2.   
  3.   
  4.   
  5.                           
  6.   
  7.      
  8.   
  9.   
  10.   
  11.                                                
  12.   
  13.      
  14.   
  15.   
  16.   
  17.                                               

    
    
    
    
     
     
     
    
   
 
 
 
  1.      
  2.                            

    

    
    
    

    

    

    
    
    
     
    
    
    
    
    
    
    
    
      
    
    
    
    
    
    

 
 
 
  1.        
  2.   
  3.     
  4.    
  5.                  

    
    
    

 
 
 
  1.      
  2.   
  3.   
  4.   
  5.        

    
    
    
    
    
    
    
    
    
    
    
    
    
   
    
    
    
    
    >
    
    
    
     
    
    
     
     
    
      
      
      
     
    

    



 
 
 
 
  
 
 
 
 
 

 
 

 
 
 
 
 

 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
   
   
       
   
   
>
>
>
 
 
 
      
      
      
    
    
      
      
      
      
 
 
 
>
>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
       
       
 
 
       
     
     
       
       
       
      
 

 
 
 

 
>
  
 
 
   
 
 
 
 
 
 
>
 
 
 
 
 
 
>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
      
     
      
      
      
    
    
      
      
      
      
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
>
 
 
 
 
 
 
 
        
 
 
 
 
   
   
   
   
   
 
 
 
>
 
>
 
 
   
 
>
 
>
 
 
>
 
 
>
 
 
 
 
 
><
 
 
>
 
 
 
 
 
 
>
 
>
 
 
 
 
 
 
 
 
 
   
 
 
     
    
   
                                                                                  
 
                                                                                                           
                                                                                                           
 
 
 
     
    
      
 
                             
 
   
 
 
 
 
 
     
    
   
                                                                                  
 
                                                                                                           
                                                                                                        
 
 
     
    
      
 
                      
 
 
 
 
 
     
    
      
 
                          
 
 
 
 
     
    
      
 
                             

   

  

 

  

 

       

        

                   

                  

        

          

          

      

            

                 

    

 

   

            

   >          

      

                

            

               

              

 

  

         

         

 

 

 

  

 

     

 

                                                                

 

       

        

    

 

   

               

 

 

    

       

 

          



           

               

<>

<>

            

>

              

    

                           

             

                

>

           

>

      

     

              

             

>

             

>

          

>

 

>

 

>

     

     

                 

 

>

                        

>

                   

>

                   

>

>

>

     

    

                   

                               

>

  

 

             

                

              

                

             

                 

        



    

转载地址:http://glgul.baihongyu.com/

你可能感兴趣的文章
IDDD 实现领域驱动设计-一个简单的 CQRS 示例
查看>>
IOS开发基础知识--碎片16
查看>>
Java的HashSet类
查看>>
Putty设置删除
查看>>
圈真的决定你的未来?
查看>>
各种分布式文件系统简介
查看>>
40 - 找出数组中仅仅出现一次的数字
查看>>
python spark 求解最大 最小 平均 中位数
查看>>
Stream API
查看>>
Turning off “Language Service Disabled” error message in VS2017
查看>>
C#根据句柄改变窗体控件值
查看>>
Beam编程系列之Python SDK Quickstart(官网的推荐步骤)
查看>>
Dropping TSO features since no CSUM feature
查看>>
java项目中通过添加filter过滤器解决ajax跨域问题
查看>>
phalcon的CLI应用
查看>>
用SVN checkout源码时,设置账号
查看>>
Linux命令及架构部署大全
查看>>
chrome插件开发之调试
查看>>
java 面试
查看>>
如何获取用户的地理位置-浏览器地理位置(Geolocation)API 简介
查看>>