继续昨天的内容 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,是关于查询比较慢的问题,和目前的使用的场景有些类似,可以做进一步的关注。

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

  1. Kafka深度解析(如何在producer中指定partition)(转)

    原文链接:Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能 ...

  2. 赵小楼《天道》《遥远的救世主》深度解析(59)现实中到底存不存在芮小丹这样的女子?

    本文是<天道>解读系列按<遥远的救世主>小说情节深度解析的第59集,解读完后会按<天道>电视剧不同于小说部分的情节再补充解读,然后会出专题解读系列,整体共约160集 ...

  3. 解析卷积的高速计算中的细节,一步步代码带你飞

    2019-11-26 21:07:42 作者:Manas Sahni 编译:ronghuaiyang 导读 卷积是深度学习中的基础运算,那么卷积运算是如何加速到这么快的呢,掰开揉碎了给你看. 在我不太 ...

  4. [Spring 深度解析]第7章 IoC容器的初始化过程

    7. IoC容器的初始化过程 ​ 简单来说,IoC容器的初始化是由前面介绍的refresh()方法来启动的,这个方法标志着IoC容器的正式启动.具体来说,这个启动包括BeanDefinition的Re ...

  5. python中superclass是什么_深度解析并实现python中的super(转载,好文)

    大神半个月的成绩,让我看的叹为观止,建议看原帖地址,会让你对Python的描述符有更强的认识. 原文链接:https://blog.csdn.net/zhangjg_blog/article/deta ...

  6. 深度解析ASP.NET2.0中的Callback机制

    callback的一般使用方法还算简单,直接参照msdn的帮助和范例就足够了.但是想要真正用好.用精,或者想开发一些基于callback机制的WEB组件,那么,就要先深入了解callback的实现机制 ...

  7. 语言中拟合函数 计算aic_Go语言函数深度解析(中)

    上回函数深度解析给大家聊了一些函数的基本知识,不知道还有没有人记得,不记得赶紧回去复习! 他们是 go语言中函数的基本原理 单/多个同/不同类型参数 单/多个同/不同类型返回值 值传递,引用传递 函数 ...

  8. Istio 网关中的 Gateway 和 VirtualService 配置深度解析

    原文链接:请求都去哪了? 通过前几篇文章的学习与实践,我们对 Gateway.VirtualService 和 Destinationrule 的概念和原理有了初步的认知,本篇将对这几个对象资源的配置 ...

  9. 部分仍在编辑文章 - Python基础专题 - 深度解析python中的赋值与拷贝

    深度解析python中的赋值与拷贝 jcLee95 的 CSDN 博客:https://blog.csdn.net/qq_28550263?spm=1011.2124.3001.5343 邮箱 :29 ...

最新文章

  1. nginx安装-添加MP4播放模块
  2. python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用
  3. 解决安卓中单个dex方法数超过65535的方法
  4. 百道Python面试题实现,搞定Python编程就靠它
  5. 27行代码AC_迷宫 2017年第八届蓝桥杯A组第一题(暴力、仿迷宫)
  6. 无人驾驶三 卡尔曼滤波及无迹卡尔曼滤波的几何意义
  7. 数论基础 欧几里得
  8. 计算机连接交换机配置命令,[计算机]交换机配置命令.doc
  9. 虚拟资源项目整合能赚钱?有人靠着虚拟资源整合实操再发布月入万元
  10. 计算机期刊在线阅读,2010年计算机领域SCI收录期刊
  11. CNI网络插件之flannel
  12. Android源码分析-dex2oat
  13. 高职单招面试流程及技巧有哪些
  14. 【数据挖掘】数据统计性描述与相似度
  15. 会计学计算机技能,财经会计专业,需要懂IT技能吗?编程呢?
  16. 区分数据库中的 char、varchar、nchar、nvarchar
  17. 使用gn创建HelloWorld工程
  18. 小路绫只会做料理 (ayaya)(树状数组 二分)
  19. 施耐德电气:打造新一代数据中心基础设施
  20. Educoder-java入门:综合练习之ATM取款机

热门文章

  1. qt 定义一个长度的数组,Qt - 声明一个QLabel数组并将其添加到QTabWidget的选项卡
  2. 局域网读取文件_教你windows局域网如何设置共享文件
  3. nodejs安装及环境配置_nodeJS安装和环境变量的配置
  4. flowable 配置自定义表单_Flowable用代码自定义流程
  5. java web 框架整合开发_SpringBoot(二)Web整合开发
  6. jmeter中控制器其中一个访问不到_Jmeter体系结构和运行原理
  7. echarts 图标高度自适应_echarts图表盒子大小变化后,图表无法自适应
  8. python 函数装饰器_python函数装饰器的用法
  9. iis Service Unavailable解决方法(权限问题)
  10. Django Mysql SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED