搞了辣么多年DBA,总有点小东西可以分享下,技术又不好,就分享点脚本吧


日常工作我习惯关注一个地方,就是数据库的增长情况。记得在很久很久以前的一个上午,我在加数据文件,但是过了几天,我还在加数据文件。此时我感觉不对劲了,凭啥几天你就让我加数据文件。凭着一股凭啥的劲,我到库里面去找到了那个让我加数据文件的罪魁祸首。我发现有个表上线个把月,但是他的大小居然排第一,都快赶上我加数据文件的速度了,于是乎我找到了这个表的作者去和他理论。你这个表为啥这么大,才上线几个月,你就让我加几个数据文件,你在上几个功能,我还能休息吗。经过详细细致的讨论,原来他这个表是记录一个流程中间的一个转存一样的表,实际上在使用过后很多历史数据可以不要了,然后经过协商调整保留时间,自此以后数据文件加的就没这么频繁了。


这个故事告诉我们,即使不懂业务,只要可以找到异常点,是可以与业务方共同解决这些问题。总的来说只要你问题遇到的多,那么业务你也就被动了解多了。要我主动学业务,那不可能,我数据库都没学明白你还想我去了解你三天一小改五天一大改的bug。

Ps:话有点绝对也不是一定不行,得加钱!!!


瞎聊完了回到脚本吧,这个语句主要是用于查询表大小的,包括了表索引、lob字段一起都查出来了。目前可以根据用户和表名去做过滤,表空间的懒得写,得加钱

上脚本

--查看表大小(包含索引和lob)
select /*统计视图*/
 table_name,
 table_total,
 index_total,
 lob_total,
 table_total + index_total + lob_total total
  from (select /*转换单位*/
         q.name table_name,
         round(sum(q.t / 1024 / 1024 / 1024), 3) table_total,
         nvl(round(sum(w.t / 1024 / 1024 / 1024), 3), 0) index_total,
         nvl(round(sum(e.t / 1024 / 1024 / 1024), 3), 0) lob_total
          from ( /*所有表*/
                select a.owner, a.segment_name name, sum(a.bytes) t
                  from dba_segments a
                  left join dba_tables b
                    on a.segment_name = b.table_name
                   and a.owner = b.owner
                 group by a.owner, a.segment_name) q
          left join ( /*所有索引*/
                    select a.owner, c.table_name name, sum(a.bytes) t
                      from dba_segments a
                      left join dba_indexes c
                        on a.segment_name = c.index_name
                       and a.owner = c.owner
                     group by a.owner, c.table_name) w
            on q.owner = w.owner
           and q.name = w.name
          left join ( /*所有LOB*/
                    select a.owner, d.table_name name, sum(a.bytes) t
                      from dba_segments a
                      left join dba_lobs d
                        on a.segment_name = d.segment_name
                       and a.owner = d.owner
                     group by a.owner, d.table_name) e
            on q.owner = e.owner
           and q.name = e.name where q.owner = 'SYS' --and q.name='OBJ$' --这个地方过滤用户和表
         group by q.name, q.owner)
 order by 5 desc;


结果展示

Oracle 查询表大小_历史数据