应用场景:最近遇到客户想知道数据库最近一年以来实际数据的增长量,当时只统计了数据文件的增长的情况,但作为DBA都很清楚,通过查看数据文件的增长情况是不够严谨的, 但当时笔者并没有确认到更合适的sql语句. 所以通过以下测试来验证解决这个问题. 以下语句适用于12C: SELECTa.snap_id, a.con_id, e.name pdbname, c.tablespace_name ts_name, to_char(to_date(a.rtime, 'mm/dd/yyyyhh24:mi:ss'), 'yyyy-mm-dd hh24:mi') rtime, round(a.tablespace_size * c.block_size / 1024 / 1024, 2) ts_size_mb, round(a.tablespace_usedsize * c.block_size/ 1024 / 1024, 2) ts_used_mb, round((a.tablespace_size -a.tablespace_usedsize) * c.block_size / 1024 / 1024, 2) ts_free_mb, round(a.tablespace_usedsize /a.tablespace_size * 100, 2) pct_used FROM cdb_hist_tbspc_space_usage a, (SELECT tablespace_id, nb.con_id, substr(rtime, 1, 10) rtime, max(snap_id) snap_id FROM dba_hist_tbspc_space_usage nb group by tablespace_id, nb.con_id, substr(rtime, 1, 10)) b, cdb_tablespaces c, v$tablespace d, V$CONTAINERS e where a.snap_id = b.snap_id and a.tablespace_id = b.tablespace_id and a.con_id = b.con_id and a.con_id = c.con_id and a.con_id = d.con_id and a.con_id = e.con_id and a.tablespace_id = d.TS# and d.NAME = c.tablespace_name and to_date(a.rtime, 'mm/dd/yyyyhh24:mi:ss') >= sysdate - 30 order by a.CON_ID, a.tablespace_id, to_date(a.rtime, 'mm/dd/yyyyhh24:mi:ss') desc; 笔者使用的数据库为oracle 19.14,表test为cdb环境下sys用户新建的测试表,表空间为system,将其增加到4049m. SQL> select bytes/1024/1024 fromuser_segments where segment_name='TEST'; BYTES/1024/1024 --------------- 4049 通过以上查询语句在pl sql中执行,可以看到TS_USED_MB从1002.94m增加到5051.88m,数据在整数位吻合. |