• 表空间使用率查询慢的原因及解决方法


    表空间使用率查询脚本:

     1 set pagesize 999 linesize 120
     2 column tablespace_name format a20
     3 select  tbs.tablespace_name,
     4              trunc(tot.bytes/1024/1024) Total_MB,
     5              trunc(tot.bytes/1024/1024-sum(nvl(fre.bytes,0))/1024/1024) MB_used,
     6              trunc(sum(nvl(fre.bytes,0))/1024/1024) MB_free,
     7              (1-sum(nvl(fre.bytes,0))/tot.bytes)*100 pct,
     8              decode(
     9                  greatest((1-sum(nvl(fre.bytes,0))/tot.bytes)*100, 90),
    10                  90, '', '*'
    11              ) pct_warn
    12    from    dba_free_space fre,
    13              (select tablespace_name, sum(bytes) bytes
    14              from    dba_data_files
    15              group by tablespace_name) tot,
    16              dba_tablespaces tbs
    17    where   tot.tablespace_name    = tbs.tablespace_name
    18    and     fre.tablespace_name(+) = tbs.tablespace_name
    19    group by tbs.tablespace_name, tot.bytes/1024/1024, tot.bytes
    20    order by 5  ;

    查看DBA_FREE_SPACE视图的sql语句

    SQL>select text from dba_views where view_name='DBA_FREE_SPACE';  
    TEXT  
    --------------------------------------------------------------------------------  
    select ts.name,  
           fi.file#,  
           f.block#,  
           f.length * ts.blocksize,  
           f.length,  
           f.file#  
      from sys.ts$ ts, sys.fet$ f, sys.file$ fi  
     where ts.ts# = f.ts#  
       and f.ts# = fi.ts#  
       and f.file# = fi.relfile#  
       and ts.bitmapped = 0  
    union all  
    select ts.name,  
           fi.file#,  
           f.ktfbfebno,  
           f.ktfbfeblks * ts.blocksize,  
           f.ktfbfeblks,  
           f.ktfbfefno  
      from sys.ts$ ts, sys.x$ktfbfe f, sys.file$ fi  
     where ts.ts# = f.ktfbfetsn  
       and f.ktfbfetsn = fi.ts#  
       and f.ktfbfefno = fi.relfile#  
       and ts.bitmapped <> 0  
       and ts.online$ in (1, 4)  
       and ts.contents$ = 0  
    union all  
    select ts.name,  
           fi.file#,  
           u.ktfbuebno,  
           u.ktfbueblks * ts.blocksize,  
           u.ktfbueblks,  
           u.ktfbuefno  
      from sys.recyclebin$ rb, sys.ts$ ts, sys.x$ktfbue u, sys.file$ fi  
     where ts.ts# = rb.ts#  
       and rb.ts# = fi.ts#  
       and u.ktfbuefno = fi.relfile#  
       and u.ktfbuesegtsn = rb.ts#  
       and u.ktfbuesegfno = rb.file#  
       and u.ktfbuesegbno = rb.block#  
       and ts.bitmapped <> 0  
       and ts.online$ in (1, 4)  
       and ts.contents$ = 0  
    union all  
    select ts.name,  
           fi.file#,  
           u.block#,  
           u.length * ts.blocksize,  
           u.length,  
           u.file#  
      from sys.ts$ ts, sys.uet$ u, sys.file$ fi, sys.recyclebin$ rb  
     where ts.ts# = u.ts#  
       and u.ts# = fi.ts#  
       and u.segfile# = fi.relfile#  
       and u.ts# = rb.ts#  
       and u.segfile# = rb.file#  
       and u.segblock# = rb.block#  
       and ts.bitmapped = 0 

    这里涉及到了回收站表sys.recyclebin$,回收站里的对象,也是会占用空间的。

    sys.recyclebin$里的大量对象会降低DBA_FREE_SPACE查询速度

    查看CDB中回收站对象数量为0,表空间使用率查询速度非常快

     1 [oracle@easdb01 ~]$ sqlplus /nolog
     2 
     3 SQL*Plus: Release 12.2.0.1.0 Production on Fri Jun 22 10:25:39 2018
     4 
     5 Copyright (c) 1982, 2016, Oracle.  All rights reserved.
     6 
     7 SQL> conn /as sysdba
     8 Connected.
     9 SQL> set timing on
    10 SQL> @/backup/scripts/show_space.sql
    11 
    12 TABLESPACE_NAME        TOTAL_MB    MB_USED    MB_FREE         PCT PC
    13 -------------------- ---------- ---------- ---------- ---------- --
    14 UNDOTBS2          23825        207    23617 .869884575
    15 UNDOTBS1          25140        226    24913 .900706046
    16 USERS                  5      1        4          20
    17 SYSAUX               5210       4800      409 92.1329175 *
    18 SYSTEM                910        901        9  99.010989 *
    19 
    20 Elapsed: 00:00:00.41
    21 SQL> select count(1) from dba_recyclebin;
    22 
    23   COUNT(1)
    24 ----------
    25      0
    26 
    27 Elapsed: 00:00:00.24

    切换到PDB:

    1 SQL> alter session set container=easpdb1;
    2 
    3 Session altered.
    4 
    5 SQL> select count(1) from dba_recyclebin;
    6 
    7   COUNT(1)
    8 ----------
    9     133880

    可以看到回收站对象数量有13W条,再在PDB下执行表空间使用率查询脚本:

     1 SQL> set timing on
     2 SQL> /
     3 
     4 TABLESPACE_NAME        TOTAL_MB    MB_USED    MB_FREE         PCT PC
     5 -------------------- ---------- ---------- ---------- ---------- --
     6 EAS_D_SURE_INDEX      65536      4    65532 .006103516
     7 EAS_D_SURE_TEMP2      16384      1    16383 .006103516
     8 EAS_D_APEX_INDEX      16384      1    16383 .006103516
     9 EAS_D_APEX_TEMP2      16384      1    16383 .006103516
    10 EAS_D_UT_TEMP2          16384        110    16273 .676727295
    11 USERS                458      3      455 .749318801
    12 EAS_D_YHDT_TEMP2      16384        183    16200 1.11961365
    13 UNDO_2              32760       1742    31017 5.31898657
    14 EAS_D_SURE_STANDARD     131072      16567     114504 12.6397133
    15 EAS_INDX         147456      31346     116109 21.2583754
    16 UNDOTBS1          30435       7057    23377 23.1875308
    17 EAS_D_YHDT_INDEX     114688      40576    74111 35.3798458
    18 EAS_D_APEX_STANDARD      65536      36103    29432  55.089283
    19 SYSAUX               8192       4855     3336 59.2666626
    20 EAS_D_UT_INDEX         114688      68927    45760  60.100174
    21 SYSTEM              13312       8158     5153 61.2877479
    22 EAS_D_YHDT_STANDARD     377282     235935     141346 62.5355669
    23 EAS_D_UT_STANDARD     638976     542054    96921 84.8317464
    24 EAS_DATA         212992     190966    22025 89.6588546
    25 
    26 19 rows selected.
    27 
    28 Elapsed: 00:19:34.41

    执行了差不多20分钟才出来结果

    清空PDB回收站再查询:

    注意:在ORACLE 12C中,各个PDB和CDB之间回收站是私有的,所以对每个PDB回收站进行单独的清空。

     1 SQL> @/backup/scripts/show_space.sql
     2 
     3 TABLESPACE_NAME        TOTAL_MB    MB_USED    MB_FREE         PCT PC
     4 -------------------- ---------- ---------- ---------- ---------- --
     5 EAS_D_SURE_INDEX      65536      4    65532 .006103516
     6 EAS_D_SURE_TEMP2      16384      1    16383 .006103516
     7 EAS_D_APEX_INDEX      16384      1    16383 .006103516
     8 EAS_D_APEX_TEMP2      16384      1    16383 .006103516
     9 EAS_D_YHDT_TEMP2      16384     66    16317 .407791138
    10 EAS_D_UT_TEMP2          16384        110    16273 .676727295
    11 USERS                458      3      455 .749318801
    12 EAS_D_SURE_STANDARD     131072      16538     114533 12.6181126
    13 EAS_INDX         147456      31346     116109 21.2583754
    14 UNDO_2              32760       7978    24781 24.3543956
    15 EAS_D_YHDT_INDEX     114688      40576    74111 35.3798458
    16 EAS_D_APEX_STANDARD      65536      36103    29432  55.089283
    17 SYSAUX               8192       4879     3312 59.5596313
    18 EAS_D_UT_INDEX         114688      68927    45760  60.100174
    19 SYSTEM              13312       8158     5153 61.2877479
    20 EAS_D_YHDT_STANDARD     377282     237630     139651 62.9849324
    21 UNDOTBS1          30435      25479     4956 83.7161163
    22 EAS_D_UT_STANDARD     638976     542047    96928 84.8306803
    23 EAS_DATA         212992     190943    22048 89.6483201
    24 
    25 19 rows selected.
    26 
    27 Elapsed: 00:07:03.21

    还是执行了7分钟,汗...

    重新收集SYS用户统计信息后执行:

     1 SQL> exec dbms_stats.gather_schema_stats(ownname => 'sys',degree => 16);
     2 
     3 PL/SQL procedure successfully completed.
     4 
     5 SQL> /
     6 
     7 TABLESPACE_NAME        TOTAL_MB    MB_USED    MB_FREE         PCT PC
     8 -------------------- ---------- ---------- ---------- ---------- --
     9 EAS_D_SURE_INDEX      65536      4    65532 .006103516
    10 EAS_D_APEX_TEMP2      16384      1    16383 .006103516
    11 EAS_D_SURE_TEMP2      16384      1    16383 .006103516
    12 EAS_D_APEX_INDEX      16384      1    16383 .006103516
    13 EAS_D_YHDT_TEMP2      16384     67    16316 .414276123
    14 EAS_D_UT_TEMP2          16384        110    16273 .676727295
    15 USERS                458      3      455 .749318801
    16 EAS_D_SURE_STANDARD     131072      16533     114538 12.6138687
    17 EAS_INDX         147456      31346     116109 21.2583754
    18 UNDO_2              32760       8466    24293 25.8440171
    19 EAS_D_YHDT_INDEX     114688      40576    74111 35.3798458
    20 EAS_D_APEX_STANDARD      65536      36103    29432  55.089283
    21 SYSAUX               8192       4883     3308 59.6107483
    22 EAS_D_UT_INDEX         114688      68927    45760  60.100174
    23 SYSTEM              13312       8158     5153 61.2877479
    24 EAS_D_YHDT_STANDARD     377282     237638     139643 62.9870528
    25 UNDOTBS1          30435      25543     4892 83.9264005
    26 EAS_D_UT_STANDARD     638976     542048    96927 84.8307389
    27 EAS_DATA         212992     190975    22016 89.6631388
    28 
    29 19 rows selected.
    30 
    31 Elapsed: 00:00:01.77
  • 相关阅读:
    java反射小练习
    Set与list测试
    关于用户界面
    自定义标签打包使用问题
    jsp中获取当前访问路径
    LeetCode 汇总
    LeetCode 46. 全排列
    LeetCode 40.组合总和II
    LeetCode 39.组合总和
    LeetCode 37.解数独
  • 原文地址:https://www.cnblogs.com/zougang/p/9214691.html
Copyright © 2020-2023  润新知