美文网首页
Oracle高水位线(HWM)及性能优化

Oracle高水位线(HWM)及性能优化

作者: baishangbing | 来源:发表于2020-06-02 18:15 被阅读0次
ORACLE在逻辑存储上分4个粒度:表空间,段,区和块.
  • 块:是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操作也是按块来操作的,也就是说当ORACLE从数据文件读数据时,是读取多少个块,而不是多少行.
  • 区:由一系列相邻的块而组成,这也是ORACLE空间分配的基本单位,举个例子来说,当我们创建一个表PM_USER时,首先ORACLE会分配一区的空间给这个表,随着不断的INSERT数据到PM_USER,原来的这个区容不下插入的数据时,ORACLE是以区为单位进行扩展的,也就是说再分配多少个区给PM_USER,而不是多少个块.
  • 段:是由一系列的区所组成,一般来说,当创建一个对象时(表,索引),就会分配一个段给这个对象.所以从某种意义上来说,段就是某种特定的数据.如CREATE TABLE PM_USER,这个段就是数据段,而CREATE INDEX ON PM_USER(NAME),ORACLE同样会分配一个段给这个索引,但这是一个索引段了.查询段的信息可以通过数据字典: SELECT * FROM USER_SEGMENTS来获得,
  • 表空间:包含段,区及块.表空间的数据物理上储存在其所在的数据文件中.一个数据库至少要有一个表空间.
确定碎片程度
  SELECT table_name,
         ROUND ( (blocks * 8), 2) "高水位空间 k",
         ROUND ( (num_rows * avg_row_len / 1024), 2) "真实使用空间 k",
         ROUND ( (blocks * 10 / 100) * 8, 2) "预留空间(pctfree) k",
         ROUND (
            (  blocks * 8
             - (num_rows * avg_row_len / 1024)
             - blocks * 8 * 10 / 100),
            2)
            "浪费空间 k"
    FROM user_tables
   WHERE temporary = 'N'
ORDER BY 5 DESC;
查看表上次收集统计信息时间
 select table_name,last_analyzed from dba_tables where owner = 'SCHEMA_NAME';
  • 整理表,不影响DML操作
SQL> alter table TABLE_NAME enable ROW MOVEMENT;--启动行移动功能
SQL> alter table TABLE_NAME shrink space compact;  --只整理碎片 不回收空间
SQL> alter table TABLE_NAME disable ROW MOVEMENT;--关闭行移动

如果要同时压缩表的索引,可以发布:ALTER TABLE TEST_TAB SHRINK SPACE CASCADE

  • 重置高水位,此时不能有DML操作
SQL> alter table TABLE_NAME enable ROW MOVEMENT;--启动行移动功能
SQL> alter table TABLE_NAME shrink space; --整理碎片并回收空间,并调整水位线。业务少时执行
SQL> alter table TABLE_NAME disable ROW MOVEMENT;--关闭行移动
  • shrink 的优势:
    不需要重建索引。
    可以在线操作
释放表的高水位通常有如下几种办法:
  • 对表进行MOVE操作:ALTER TABLE TABLE_NAME MOVE;。若表上存在索引,则记得重建索引。
  • 对表进行SHRINK SPACE操作:ALTER TABLE TABLE_NAME SHRINK SPACE;,注意,在执行该指令之前必须开启行移动:ALTER TABLE TABLE_NAME ENABLE ROW MOVEMENT;。该方法的优点是:在碎片整理结束后,表上相关的索引仍然有效,缺点是会产生大量的UNDO和REDO。
  • 复制要保留的数据到临时表T,DROP原表,然后RENAME临时表T为原表。
  • exp/imp或expdp/impdp重构表。
  • 若表中没有数据则直接使用TRUNCATE来释放高水位。
如何找出系统中哪些表拥有高水位呢?
  • 比较表的行数和表的大小关系。如果行数为0,而表的当前占用大小减去初始化时的大小(INITIAL_EXTENT)后依然很大,那么说明该表有高水位。
  • 行数和块数的比率,即查看一个块可以存储多少行数据。如果一个块存储的行数少于5行甚至更少,那么说明有高水位。
    注意:
    这两种方法都不是十分准确,需要再对查询结果进行筛选。需要注意的是,在查询表的高水位时,首先需要分析表,以得到最准确的统计信息。
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;
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%' ;

相关文章

  • Oracle高水位线(HWM)及性能优化

    ORACLE在逻辑存储上分4个粒度:表空间,段,区和块. 块:是粒度最小的存储单位,现在标准的块大小是8K,ORA...

  • Oracle高水位线HWM

    说到HWM,我们首先要简要的谈谈ORACLE的逻辑存储管理。我们知道,ORACLE在逻辑存储上分4个粒度: 表空间...

  • 修正ORACLE表的高水位线HWM

    HWM 全名HIGH WATER MARK在ORACLE中,执行对表的删除操作不会降低该表的高水位线。而全表扫...

  • oracle高水位线

    参考资料:https://www.cnblogs.com/linjiqin/archive/2012/01/15/...

  • oracle删除数据慢

    原因分析 SQL的阻塞、触发器、外键约束、高水位线(HWM)等因素中的某一个导致DELETE操作慢 问题的根源就在...

  • Awesome Extra

    性能优化 性能优化模式 常见性能优化策略的总结 Spark 性能优化指南——基础篇 Spark 性能优化指南——高...

  • 「性能优化2.2」获取布局的加载时间

    「性能优化1.0」启动分类及启动时间的测量「性能优化1.1」计算方法的执行时间「性能优化1.2」异步优化「性能优化...

  • 「性能优化2.4」 AsyncLayoutInflater实现异

    「性能优化1.0」启动分类及启动时间的测量「性能优化1.1」计算方法的执行时间「性能优化1.2」异步优化「性能优化...

  • 「性能优化2.3」Choreographer检测丢帧

    「性能优化1.0」启动分类及启动时间的测量「性能优化1.1」计算方法的执行时间「性能优化1.2」异步优化「性能优化...

  • 「性能优化2.1」LayoutInflater Hook控件加载

    「性能优化1.0」启动分类及启动时间的测量「性能优化1.1」计算方法的执行时间「性能优化1.2」异步优化「性能优化...

网友评论

      本文标题:Oracle高水位线(HWM)及性能优化

      本文链接:https://www.haomeiwen.com/subject/ozhpzhtx.html