楼主: guoyJoe

[精华] 一条UPDATE从生到死的整个过程的深入解析

[复制链接]
论坛徽章:
5
复活蛋
日期:2012-11-02 16:27:37灰彻蛋
日期:2013-01-27 17:08:112013年新春福章
日期:2013-02-25 14:51:24复活蛋
日期:2013-05-27 15:29:10优秀写手
日期:2014-07-01 06:00:12
91#
发表于 2013-5-25 10:39 | 只看该作者
郭大师:“从段头读出Extent Map,开始全扫描”,能具体解释一下Extent Map,以及如何根据它开始全表扫描吗?谢谢。

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
92#
 楼主| 发表于 2013-5-25 18:34 | 只看该作者
digdeep126 发表于 2013-5-25 10:39
郭大师:“从段头读出Extent Map,开始全扫描”,能具体解释一下Extent Map,以及如何根据它开始全表扫描吗 ...

gyj@OCM> create table guoyj(id int,name varchar2(10));
Table created.
gyj@OCM> insert into guoyj values(1,'guoyj1');
1 row created.
gyj@OCM> commit;
Commit complete.

yj@OCM> set autot traceonly;
gyj@OCM> select * from guoyj;

Execution Plan
----------------------------------------------------------
Plan hash value: 3898741468
---------------------------------------------------------------------------
| Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |       |     1 |    20 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| GUOYJ |     1 |    20 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement (level=2)

Statistics
----------------------------------------------------------
         48  recursive calls
          0  db block gets
         19  consistent gets
          0  physical reads
          0  redo size
        485  bytes sent via SQL*Net to client
        420  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
gyj@OCM> select * from guoyj;

Execution Plan
----------------------------------------------------------
Plan hash value: 3898741468
---------------------------------------------------------------------------
| Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |       |     1 |    20 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| GUOYJ |     1 |    20 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement (level=2)

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          7  consistent gets
          0  physical reads
          0  redo size
        485  bytes sent via SQL*Net to client
        420  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

gyj@OCM> set autot off;
gyj@OCM> select HEADER_FILE,HEADER_BLOCK  from dba_segments where segment_name='GUOYJ';
HEADER_FILE HEADER_BLOCK
----------- ------------
          6          154
gyj@OCM> select id,name,dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from guoyj;
        ID NAME       DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
---------- ---------- ------------------------------------ ------------------------------------
         1 guoyj1                                        6                                  159

gyj@OCM> select EXTENT_ID,file_id,block_id,blocks from dba_extents where segment_name='GUOYJ';
EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
---------- ---------- ---------- ----------
         0          6        152          8

Extent Control Header
  -----------------------------------------------------------------
  Extent Header:: spare1: 0      spare2: 0      #extents: 1      #blocks: 8     
                  last map  0x00000000  #maps: 0      offset: 2716  
      Highwater:: 0x018000a0  ext#: 0      blk#: 8      ext size: 8     
  #blocks in seg. hdr's freelists: 0     
  #blocks below: 5     
  mapblk  0x00000000  offset: 0     
                   Unlocked
  --------------------------------------------------------
  Low HighWater Mark :
      Highwater::  0x018000a0  ext#: 0      blk#: 8      ext size: 8     
  #blocks in seg. hdr's freelists: 0     
  #blocks below: 5     
  mapblk  0x00000000  offset: 0     
  Level 1 BMB for High HWM block: 0x01800098
  Level 1 BMB for Low HWM block: 0x01800098
  --------------------------------------------------------
  Segment Type: 1 nl2: 1      blksz: 8192   fbsz: 0      
  L2 Array start offset:  0x00001434
  First Level 3 BMB:  0x00000000
  L2 Hint for inserts:  0x01800099
  Last Level 1 BMB:  0x01800098
  Last Level II BMB:  0x01800099
  Last Level III BMB:  0x00000000
     Map Header:: next  0x00000000  #extents: 1    obj#: 74764  flag: 0x10000000
  Inc # 0
  Extent Map
  -----------------------------------------------------------------
   0x01800098  length: 8     
  
  Auxillary Map
  --------------------------------------------------------
   Extent 0     :  L1 dba:  0x01800098 Data dba:  0x0180009b
  --------------------------------------------------------
  
   Second Level Bitmap block DBAs
   --------------------------------------------------------
   DBA 1:   0x01800099
  

PARSING IN CURSOR #2 len=19 dep=0 uid=91 oct=3 lid=91 tim=1369477443489414 hv=3458242473 ad='4b9a3968' sqlid='7k00
snm7215x9'
select * from guoyj
END OF STMT
PARSE #2:c=1000,e=560,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=3898741468,tim=1369477443489410
EXEC #2:c=0,e=80,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=3898741468,tim=1369477443489631
WAIT #2: nam='SQL*Net message to client' ela= 10 driver id=1650815232 #bytes=1 p3=0 obj#=0 tim=1369477443489746
WAIT #2: nam='Disk file operations I/O' ela= 86 FileOperation=2 fileno=6 filetype=2 obj#=74764 tim=136947744348998
4
WAIT #2: nam='db file sequential read' ela= 48 file#=6 block#=154 blocks=1 obj#=74764 tim=1369477443490077
WAIT #2: nam='db file scattered read' ela= 155 file#=6 block#=155 blocks=5 obj#=74764 tim=1369477443490633
FETCH #2:c=999,e=987,p=6,cr=7,cu=0,mis=0,r=1,dep=0,og=1,plh=3898741468,tim=1369477443490792
WAIT #2: nam='SQL*Net message from client' ela= 628 driver id=1650815232 #bytes=1 p3=0 obj#=74764 tim=136947744349
1497
FETCH #2:c=0,e=14,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=3898741468,tim=1369477443491617
STAT #2 id=1 cnt=1 pid=0 pos=1 obj=74764 op='TABLE ACCESS FULL GUOYJ (cr=7 pr=6 pw=0 time=0 us cost=3 size=20 card
=1)'
WAIT #2: nam='SQL*Net message to client' ela= 7 driver id=1650815232 #bytes=1 p3=0 obj#=74764 tim=1369477443491872
WAIT #2: nam='SQL*Net message from client' ela= 6632 driver id=1650815232 #bytes=1 p3=0 obj#=74764 tim=13694774434
98542

段头块---->高水位块(不包括高水位块):154  155 156 157 158 159


使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
93#
 楼主| 发表于 2013-5-25 18:53 | 只看该作者
digdeep126 发表于 2013-5-25 10:39
郭大师:“从段头读出Extent Map,开始全扫描”,能具体解释一下Extent Map,以及如何根据它开始全表扫描吗 ...

继续,有两个区的测试:
gyj@OCM> begin
  2   for i in 2 .. 1000 loop
  3    insert into guoyj values(i,'gyj'||i);
  4    commit;
  5   end loop;
  6  end;
  7  /
PL/SQL procedure successfully completed.
gyj@OCM>  select EXTENT_ID,file_id,block_id,blocks from dba_extents where segment_name='GUOYJ';
EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
---------- ---------- ---------- ----------
         0          6        152          8
gyj@OCM> begin
  2   for i in 1001 .. 5000 loop
  3    insert into guoyj values(i,'gyj'||i);
  4    commit;
  5   end loop;
  6  end;
  7  /
PL/SQL procedure successfully completed.
gyj@OCM> select EXTENT_ID,file_id,block_id,blocks from dba_extents where segment_name='GUOYJ';
EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
---------- ---------- ---------- ----------
         0          6        152          8
         1          6        160          8
Extent Control Header
  -----------------------------------------------------------------
  Extent Header:: spare1: 0      spare2: 0      #extents: 2      #blocks: 16   
                  last map  0x00000000  #maps: 0      offset: 2716  
      Highwater::  0x018000a8  ext#: 1      blk#: 8      ext size: 8     
  #blocks in seg. hdr's freelists: 0     
  #blocks below: 13   
  mapblk  0x00000000  offset: 1     
                   Unlocked
  --------------------------------------------------------
  Low HighWater Mark :
      Highwater::  0x018000a8  ext#: 1      blk#: 8      ext size: 8     
  #blocks in seg. hdr's freelists: 0     
  #blocks below: 13   
  mapblk  0x00000000  offset: 1     
  Level 1 BMB for High HWM block: 0x01800098
  Level 1 BMB for Low HWM block: 0x01800098
  --------------------------------------------------------
  Segment Type: 1 nl2: 1      blksz: 8192   fbsz: 0      
  L2 Array start offset:  0x00001434
  First Level 3 BMB:  0x00000000
  L2 Hint for inserts:  0x01800099
  Last Level 1 BMB:  0x01800098
  Last Level II BMB:  0x01800099
  Last Level III BMB:  0x00000000
     Map Header:: next  0x00000000  #extents: 2    obj#: 74764  flag: 0x10000000
  Inc # 0
  Extent Map
  -----------------------------------------------------------------
   0x01800098  length: 8     
   0x018000a0  length: 8     
  
  Auxillary Map
  --------------------------------------------------------
   Extent 0     :  L1 dba:  0x01800098 Data dba:  0x0180009b
   Extent 1     :  L1 dba:  0x01800098 Data dba:  0x018000a0
  --------------------------------------------------------
  
   Second Level Bitmap block DBAs
   --------------------------------------------------------
   DBA 1:   0x01800099
gyj@OCM> gyj@OCM> select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from guoyj group by dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) order by 2;

DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------ ------------------------------------
                                   6                                  155
                                   6                                  156
                                   6                                  157
                                   6                                  158
                                   6                                  159
                                   6                                  160
                                   6                                  161
                                   6                                  163
                                   6                                  164
                                   6                                  165
                                   6                                  166
                                   6                                  167

WAIT #2: nam='db file sequential read' ela= 41 file#=6 block#=154 blocks=1 obj#=74764 tim=1369478327396683
----从段头块(154号块)一直开始读
WAIT #2: nam='db file scattered read' ela= 86 file#=6 block#=155 blocks=5 obj#=74764 tim=1369478327397112
----155 156 157 158 159
WAIT #2: nam='db file scattered read' ela= 195 file#=6 block#=160 blocks=8 obj#=74764 tim=1369478327900832
160 161 162 163 164 165 166 167
(我们来看高水位Highwater::  0x018000a8 ,即168号块,全表扫描只读到高高水位这个块这下就OK了)
其它的我就不必多了,呵呵,看完就基本明白了。。。

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
94#
 楼主| 发表于 2013-5-25 19:04 | 只看该作者
SOAD_OOAD_SOAP 发表于 2013-4-26 15:33
问个问题:监听子进程1为什么不能完成子进程2的工作,而是要派生出一个子进程2,或者监听进程不直接派生出子 ...

监听生成子进程1是串行化操作的,监听在没有收到子进程1返回退出的消息,会一直等子程1,这个过程监听做不了任何事情,所以子进程1会在生成子进程2的速度很快,以免监听等时间太长,为什么进监听不直接生成子进程2呢,我猜因为生成子进程2的时间太长了,监听要等子程2回给它消息再接收别人的连接,那数据库连接就要排队了。。。子程2就我们的server process,它要初化工作获取主机名所对的ip地址进程信息等信息后,把这些信息要发送给监听。。。。

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
95#
 楼主| 发表于 2013-5-25 19:05 | 只看该作者
赵向冲 发表于 2013-4-26 16:04
我看到这道题,我会考虑是不是要考我对oracle的体系架构的理解,我会从前台进行(用户进程),系统全局区( ...

sga和后台进程这块东西太多了,是Oracle核心部分是最重要的也最复杂的。。。

使用道具 举报

回复
论坛徽章:
0
96#
发表于 2013-5-29 14:16 | 只看该作者
大牛, 太牛了

使用道具 举报

回复
论坛徽章:
0
97#
发表于 2013-5-31 16:00 | 只看该作者
膜拜啊

使用道具 举报

回复
论坛徽章:
0
98#
发表于 2013-5-31 16:32 | 只看该作者
看来现在还很水啊

使用道具 举报

回复
论坛徽章:
0
99#
发表于 2013-6-1 16:27 | 只看该作者
郭老师威武!!!

使用道具 举报

回复
论坛徽章:
0
100#
发表于 2013-6-1 17:06 | 只看该作者
要不要分析到这个地步啊

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表