深度解析dba_segments和sys.seg$中的细节差异(下)

继续昨天的内容 http://blog.itpub.net/23718752/viewspace-1624762/
我们已经根据dba_segments和sys.seg$的不同发现最后的差距有2T左右,已经定位到了dba_segments的一些细节信息,可以发现其实还是一个层级的调用关系。

我们把SYS_DBA_SEGS是一个处于中间层的角色,它的定义是3个union all,可以从定义中看到,差别主要还是segment_type的不同,我们采用逐个击破的方法,一个一个来看。
-->第一个子查询
 select NVL(u.name, 'SYS'), sum(s.blocks)
                               from sys.user$ u, sys.obj$ o, sys.ts$ ts, sys.sys_objects so, sys.seg$ s,
                                    sys.file$ f
                               where s.file# = so.header_file
                                 and s.block# = so.header_block
                                 and s.ts# = so.ts_number
                                 and s.ts# = ts.ts#
                                 and o.obj# = so.object_id
                                 and o.owner# = u.user# (+)
                                 and s.type# = so.segment_type_id
                                 and o.type# = so.object_type_id
                                 and s.ts# = f.ts#
                                 and s.file# = f.relfile#
                                 and u.name='PRDAPPO'
group by u.name                               
NVL(U.NAME,'SYS')              SUM(S.BLOCKS)
------------------------------ -------------
PRDAPPO                            323983920
SQL> select 32398390*8192/1024/1024 size_MB from dual;
   SIZE_MB
----------
253112.422
-->第二个子查询。
select NVL(u.name, 'SYS'),sum( s.blocks)
                               from sys.user$ u, sys.ts$ ts, sys.undo$ un, sys.seg$ s, sys.file$ f
                               where s.file# = un.file#
                                 and s.block# = un.block#
                                 and s.ts# = un.ts#
                                 and s.ts# = ts.ts#
                                 and s.user# = u.user# (+)
                                 and s.type# in (1, 10)
                                 and un.status$ != 1
                                 and un.ts# = f.ts#
                                 and un.file# = f.relfile#
                                 and u.name='PRDAPPO'
group by u.name  

no rows selected
-->第三个子查询
select NVL(u.name, 'SYS'), sum( s.blocks)
                               from sys.user$ u, sys.ts$ ts, sys.seg$ s, sys.file$ f
                               where s.ts# = ts.ts#
                                 and s.user# = u.user# (+)
                                 and s.type# not in (1, 5, 6, 8, 10)
                                 and s.ts# = f.ts#
                                 and s.file# = f.relfile#
                                 and u.name='PRDAPPO'
group by u.name         
no rows selected

所以看来主要的数据还是在第一个子查询,但是如果细想,有点奇怪啊,基表中查到的数据是2.6T左右。那剩下的2T还没有找到原因,到底差在哪了。
我们这个时候可以往回看,sys.seg$里的信息得到的是2.6T,dba_segments里面得到的信息是5T左右。那么唯一的差别就在于sys_dba_segs了,是不是这个中间表做了什么操作呢。
我们截取相关的字段查看一下。
select sum(decode(bitand(segment_flags, 131072), 131072, blocks,
                                          (decode(bitand(segment_flags,1),1,
                                           dbms_space_admin.segment_number_blocks(tablespace_id, relative_fno,
                                           header_block, segment_type_id, buffer_pool_id, segment_flags,
                                           segment_objd, blocks), blocks))))
                                           from sys_dba_segs where owner='PRDAPPO'  ;
SUM(DECODE(BITAND(SEGMENT_FLAGS,131072),131072,BLOCKS,(DECODE(BITAND(SEGMENT_FLA
--------------------------------------------------------------------------------
                                                                       607401104

这下数字就对上了,可以看到在统计过程中,做了大量的判断,可以从下面改动的语句中做一些基本的分析。
SQL> select 
    sum(decode(bitand(segment_flags, 131072), 131072,blocks)) col1,
    sum(decode(bitand(segment_flags,1),1,dbms_space_admin.segment_number_blocks(tablespace_id, relative_fno,
                                           header_block, segment_type_id, buffer_pool_id, segment_flags,
                                           segment_objd, blocks)))  col2
from sys_dba_segs where owner='PRDAPPO' group by segment_flags ; 
  12860336   12860336
              4145504
 209686704  210292912
            385152992

可以从上面的语句看出,主要的差别数据都在dbms_space_admin.segment_number_blocks调用中产生差异。
对此,我们需要查看一下这个包中对应的代码,但是不幸的是这部分代码做了屏蔽,我们看看是怎么描述的。
 function segment_number_blocks(
        header_tablespace_id    in    natural ,
        header_relative_file    in    positive ,
        header_block            in    positive ,
        segment_type            in    positive ,
        buffer_pool_id          in    natural ,
        dictionary_flags        in    natural ,
        data_object_id          in    number,
        dictionary_blocks       in    number
                        ) return pls_integer;
  pragma RESTRICT_REFERENCES(segment_number_blocks,WNDS,WNPS,RNPS);
  --
  -- Returns the number of blocks which belong to the segment. Will return
  -- NULL if segment has disappeared. IS NOT to be used for any other
  -- purposes but by the views which need it and are sure that there info
  -- is correct. Else internal errors will abound
我们继续来看一下,尽管没有代码可供参考,但是我们还是能够做些什么,至少我们可以定位到底是哪些segment在统计时出现了大的数据出入。
我们用下面的语句来看一下。
col segment_name format a30
col partition_name format a20
select t1.segment_name,t1.partition_name,t1.sum_blocks,t2.sum_blocks,(t1.sum_blocks-t2.sum_blocks)*8192/1024/1024 diff_size_MB
from
(select owner,segment_name,partition_name,sum(blocks) sum_blocks from dba_segments where owner='PRDAPPO' group by owner,segment_name,partition_name )t1,
(select NVL(u.name, 'SYS')owner,o.name oname,o.subname,sum(s.blocks) sum_blocks
                               from sys.user$ u, sys.obj$ o, sys.ts$ ts, sys.sys_objects so, sys.seg$ s,
                                    sys.file$ f
                               where s.file# = so.header_file
                                 and s.block# = so.header_block
                                 and s.ts# = so.ts_number
                                 and s.ts# = ts.ts#
                                 and o.obj# = so.object_id
                                 and o.owner# = u.user# (+)
                                 and s.type# = so.segment_type_id
                                 and o.type# = so.object_type_id
                                 and s.ts# = f.ts#
                                 and s.file# = f.relfile#
                                 and u.name='PRDAPPO'  
group by    u.name,o.name,o.subname)t2
where t1.owner=t2.owner
and t1.segment_name=t2.oname
and t1.partition_name=t2.subname
and t1.sum_blocks-t2.sum_blocks>0
order by t1.sum_blocks-t2.sum_blocks desc 
可以看到,对于不同的segment_type产生的数据差异。可以看到在分区表中还是存在着较大的出入,数据差别 779705M+697946M+445368 大约是1.9T左右,可见问题的定位找到了一些突破口。

SEGMENT_TYPE       SUM_BLOCKS SUM_BLOCKS DIFF_SIZE_MB
------------------ ---------- ---------- ------------
TABLE PARTITION     292044544  192242304       779705
INDEX PARTITION     131229056   41891872    697946.75
LOB PARTITION       110592896   53585792       445368
INDEX                27807392    4629536       181077
TABLE                44770432   31578752       103060
LOBSEGMENT            5386880     220928        40359
LOBINDEX                14336      14336            0

通过上面的语句我们可以继续分析。为什么有些分区相关的段有较大的数据差异。
同时也在Metalink上查了一下,有一篇文章:Bug 12940620  Cached block/extent counts in SEG$ not updated after ADD extent
这个里面描述的是一个bug,是关于查询比较慢的问题,和目前的使用的场景有些类似,可以做进一步的关注。

时间: 2024-09-20 16:39:36

深度解析dba_segments和sys.seg$中的细节差异(下)的相关文章

深度解析dba_segments和sys.seg$中的细节差异(上)

今天在查看系统空间使用情况的时候,发现一个细节的问题,自己死磕了一把,还是发现了不少有价值的东西. 事情的起因是我在使用脚本在某个环境中查看每个用户所占有的空间的时候,如果发现有些临时用户占用的空间过大,就需要协调开发去做一些清理,但是这次用户占用的空间表空间使用情况有很大的差异. 查看用户占用空间的情况如下,可以看到总体用户占用的空间在2T多一些.USERNAME                       Default TBS     TEMP TBS        CREATED    

深度解析ASP.NET 2.0中的Callback机制

callback的一般使用方法还算简单,直接参照msdn的帮助和范例就足够了. 但是想要真正用好.用精,或者想开发一些基于callback机制的WEB组件,那么 ,就要先深入了解callback的实现机制了.在本文中,Teddy将和您一起解析 callback的整个调用.反馈机制,相信对于帮助您更好的使用callback,将能有 一定的益处. Callback vs Atlas 首先,谈谈Atlas.很多朋友可能会觉得奇怪,已经有了Callback,为什么又 要出Atlas呢?关于这个问题,At

深度解析光伏分发的系统中逆变器应用知识

输出电压的波形失真度:当光伏逆变器输出电压为正弦度时,应规定允许的最大波形失真度(或谐波含量).通常以输出电压的总波形失真度表示,其值不应超过5%(单相输出允许10%). 1.额定输出频率 光伏逆变器输出交流电压的频率应是一个相对稳定的值,通常为工频50Hz.正常工作条件下其偏差应在±1%以内. 2.负载功率因数 表征光伏逆变器带感性负载或容性负载的能力.在正弦波条件下,负载功率因数为0.7-0.9(滞后),额定值为0.9. 3.额定输出电流(或额定输出容量) 表示在规定的负载功率因数范围内逆变

深度解析javascript中的浅复制和深复制

     在谈javascript的浅复制和深复制之前,我们有必要在来讨论下js的数据类型.我们都知道有 Number,Boolean,String,Null,Undefined,Object五种类型.而Object又包含Function,Array 和Object自身.前面的五种类型叫做基本类型,而Object是引用类型.可能有人就要问,为什么要分基本类型和引用类型呢?后面你就会明白的.      我们首先来看看浅复制和深复制的简洁定义: 深复制:直接将数据复制给对应的变量 浅复制:将数据的地

Pedro Domingos深度解析机器学习五大流派中主算法精髓

本文联合编译:Blake, 高斐 Pedro Domingos是华盛顿大学计算机科学与工程学教授,也是国际机器学习协会的联合创始人之一.他曾在IST Lisbon获得电子工程和计算科学的硕士学位,在加州大学Irvine分校获得信息与计算科学博士学位.而后在IST作为助理教授工作了两年,于1999年加入华盛顿大学.他还是SIGKDD创新奖获得者(数据科学领域中最高奖项),也是AAAI Fellow之一.雷锋网(公众号:雷锋网)注:本文是Pedro Domingos在Google所作的机器学习演讲内

Docker 1.7.0 深度解析

6月16日,Docker 1.7.0 发布,重磅炸弹在Docker圈引起巨大轰动,同时也为6月22日在旧金山举办的DockerCon大会献礼. show_meitu_1.jpg 早在Docker 1.6.0之际,Docker官方的工程师即宣称:1.7.0版本将会带来很大的变化,包括:Docker的bug修改以及功能添加:并且还体现在Docker的架构上,如网络模块等. 话不多说,赶紧让我们进入Docker 1.7.0的深度解析.从Docker的版本变更日志来看,Docker 1.7.0在四个方面

深度解析如何做好页面SEO优化

页面seo优化在站内优化中占了很大一部分.那么如果做好页面优化呢?页面优化具体包括哪些细节部分优化呢?今天天津seo研究中心的tjseoer老师为大家做深度解析. 一.页面优化首先是标题title 标签 1.标题要紧扣文章中心内容,且标题的唯一独特性,目的可以让浏览者一看标题就知道内容是关于什么的,也是对搜索引擎的友好; 2.为标题加H1标签,同时标题出现的位置出现在<head>之后最好,为了搜索引擎最快找到标题. 3.标题字数控制在32字以内,多了在搜索结果里也无法显示.以及关键词出现的位置

深度解析Java 8:JDK1.8 AbstractQueuedSynchronizer的实现分析

前言 Java中的FutureTask作为可异步执行任务并可获取执行结果而被大家所熟知.通常可以使用future.get()来获取线程的执行结果,在线程执行结束之前,get方法会一直阻塞状态,直到call()返回,其优点是使用线程异步执行任务的情况下还可以获取到线程的执行结果,但是FutureTask的以上功能却是依靠通过一个叫AbstractQueuedSynchronizer的类来实现,至少在JDK 1.5.JDK1.6版本是这样的(从1.7开始FutureTask已经被其作者Doug Le

弹性计算峰会及神龙云服务器深度解析回顾

10月13日上午,云栖大会弹性计算全新企业线峰会主要内容有对弹性计算做了全面的精彩总结和产品细节分享,议程里发布了这个时代的新物种"神龙云服务器",当日在阿里云官网首屏神龙云服务器也同步发布上线,峰会现场研发总监张献涛对神龙云服务器做了深度解析,并在圆桌讨论环节为观众做了解答. 蒋林泉认为:"阿里云ECS是全世界最快的云主机." ECS超级稳定 背后的秘密是强健的IDC基础设施+飞天大规模智能运维能力:飞天自研领先核心虚拟化技术+业界最新的硬件架构,其中计算虚拟化核