oracle如何查询表碎片
admin
2023-04-22 00:21:53
0次

SELECT OWNER,

       TABLE_NAME,

       SEGMENT_TYPE,

       segment_space_management MANAGEMENT,

       TABLE_MB USED_MB,

       ROUND(WASTE_PER * TABLE_MB / 100, 2) FRAG_MB,

       WASTE_PER fragment_per,

       LAST_ANALYZED

  FROM (SELECT OWNER,

               SEGMENT_NAME TABLE_NAME,

               LAST_ANALYZED,

               SEGMENT_TYPE,

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

               ROUND(BYTES / POWER(1024, 2), 2) TABLE_MB,

               NUM_ROWS,

               BLOCKS,

               EMPTY_BLOCKS,

               HWM HIGHWATER_MARK,

               AVG_USED_BLOCKS,

               CHAIN_PER,

               EXTENTS,

               MAX_EXTENTS,

               ALLO_EXTENT_PER,

               DECODE(GREATEST(MAX_FREE_SPACE - NEXT_EXTENT, 0), 0, 'N', 'Y') CAN_EXTEND_SPACE,

               NEXT_EXTENT,

               MAX_FREE_SPACE,

               O_TABLESPACE_NAME TABLESPACE_NAME,

               block_size,

               segment_space_management

          FROM (SELECT A.OWNER OWNER,

                       A.SEGMENT_NAME,

                       A.SEGMENT_TYPE,

                       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))) / dt.block_size, 0), 0, 1,

                              ROUND((B.AVG_ROW_LEN * NUM_ROWS * (1 + (PCT_FREE / 100))) / dt.block_size, 0)) + 2 AVG_USED_BLOCKS,

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

                             2) CHAIN_PER,

                       ROUND(100 * (A.EXTENTS / A.MAX_EXTENTS), 2) ALLO_EXTENT_PER,

                       A.EXTENTS EXTENTS,

                       A.MAX_EXTENTS MAX_EXTENTS,

                       B.NEXT_EXTENT NEXT_EXTENT,

                       B.TABLESPACE_NAME O_TABLESPACE_NAME,

                       B.LAST_ANALYZED,

                       dt.block_size,

                       DT.segment_space_management

                  FROM SYS.DBA_SEGMENTS A,

                       SYS.DBA_TABLES   B,

                       dba_tablespaces  dt

                 WHERE A.OWNER = B.OWNER

                   and SEGMENT_NAME = TABLE_NAME

                   and SEGMENT_TYPE = 'TABLE'

                 --  and dt.segment_space_management = 'AUTO'

                 --  and B.table_name='LS_REPORT_VALUE_COLLECT'

                   and dt.tablespace_name = a.tablespace_name

                   --and b.last_analyzed > to_date('20070601', 'yyyymmdd')

                union all

                SELECT A.OWNER OWNER,

                       SEGMENT_NAME || '.' || B.PARTITION_NAME,

                       SEGMENT_TYPE,

                       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 * B.NUM_ROWS * (1 + (B.PCT_FREE / 100))) / dt.block_size, 0), 0, 1,

                              ROUND((B.AVG_ROW_LEN * B.NUM_ROWS * (1 + (B.PCT_FREE / 100))) / dt.block_size, 0)) + 2 AVG_USED_BLOCKS,

                              ROUND(100 * (NVL(B.CHAIN_CNT, 0) / GREATEST(NVL(B.NUM_ROWS, 1), 1)), 2) CHAIN_PER,

                       ROUND(100 * (A.EXTENTS / A.MAX_EXTENTS), 2) ALLO_EXTENT_PER,

                       A.EXTENTS EXTENTS,

                       A.MAX_EXTENTS MAX_EXTENTS,

                       B.NEXT_EXTENT,

                       B.TABLESPACE_NAME O_TABLESPACE_NAME,

                       d.last_analyzed,

                       dt.block_size,

                       DT.segment_space_management

                  FROM SYS.DBA_SEGMENTS       A,

                       SYS.DBA_TAB_PARTITIONS B,

                       SYS.DBA_TABLES         D,

                       dba_tablespaces        dt

                 WHERE A.OWNER = B.TABLE_OWNER

                   and SEGMENT_NAME = B.TABLE_NAME

                   and SEGMENT_TYPE = 'TABLE PARTITION'

                  -- and dt.segment_space_management = 'AUTO'

                  -- and B.table_name='LS_REPORT_VALUE_COLLECT'

                   and dt.tablespace_name = a.tablespace_name

                   AND D.OWNER = B.TABLE_OWNER

                   AND D.TABLE_NAME = B.TABLE_NAME

                   AND A.PARTITION_NAME = B.PARTITION_NAME,

                   --AND D.last_analyzed > to_date('20070601', 'yyyymmdd')),

               (SELECT TABLESPACE_NAME F_TABLESPACE_NAME,

                       MAX(BYTES) MAX_FREE_SPACE

                  FROM SYS.DBA_FREE_SPACE

                 GROUP BY TABLESPACE_NAME)

         WHERE F_TABLESPACE_NAME = O_TABLESPACE_NAME

           AND GREATEST(ROUND(100 * (NVL(HWM - AVG_USED_BLOCKS, 0) /GREATEST(NVL(HWM, 1), 1)),2), 0) > 25

           AND OWNER not in ('SYS', 'SYSMAN')

           AND BLOCKS > POWER(1024, 2) / block_size)

 where ROUND(WASTE_PER * TABLE_MB / 100, 2) > 100

 ORDER BY 7 DESC;

USED_MB:表示对象已使用大小

FRAG_MB:表示碎片所占大小

FRAGMENT_PER:表示碎片率百分比

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...