[20160407]sql语句父子游标的堆转储.txt

简介: [20160407]sql语句父子游标的堆转储.txt --昨天晚上看一些文档,发现可以通过alter session set events 'immediate trace name heapdump_addr level 2,addr 0xXXXXXXXX'; --后面加堆地址,转储里面的内容.

[20160407]sql语句父子游标的堆转储.txt

--昨天晚上看一些文档,发现可以通过alter session set events 'immediate trace name heapdump_addr level 2,addr 0xXXXXXXXX';
--后面加堆地址,转储里面的内容.自己测试看看:

--另外补充说明一下: 我看了jonathan lewis <oracle核心技术> 里面提到ds 应该是 data segment.

1.环境:

SCOTT@book> @ &r/ver1

PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SCOTT@book> select * from dept where deptno=10;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK

sql_id=4xamnunv51w9j

SYS@book> @ &r/sharepool/shp4   4xamnunv51w9j 0
old  17:  WHERE kglobt03 = '&1'  or kglhdpar='&1' or kglhdadr='&1' or KGLNAHSH= &2
new  17:  WHERE kglobt03 = '4xamnunv51w9j'  or kglhdpar='4xamnunv51w9j' or kglhdadr='4xamnunv51w9j' or KGLNAHSH= 0

TEXT           KGLHDADR         KGLHDPAR         C40                                      KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
-------------- ---------------- ---------------- ---------------------------------------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
子游标句柄地址 000000007C56A510 000000007CAB4BA8 select * from dept where deptno=10       000000007CE32168 000000007BE1A000       4488      12144       3067     19699      19699  911274289 4xamnunv51w9j          0
父游标句柄地址 000000007CAB4BA8 000000007CAB4BA8 select * from dept where deptno=10       000000007CB93CE0 00                     4720          0          0      4720       4720  911274289 4xamnunv51w9j      65535

2.测试:

--转储父游标堆0信息:
SYS@book> select a.* from x$ksmsp a where a.ksmchpar='000000007CB93CE0';
ADDR                   INDX    INST_ID   KSMCHIDX   KSMCHDUR KSMCHCOM         KSMCHPTR           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR
---------------- ---------- ---------- ---------- ---------- ---------------- ---------------- ---------- -------- ---------- ----------------
00007F666D754BE0      19225          1          1          1 KGLH0^3650f131   000000007BE19890       4096 recr           4095 000000007CB93CE0

SYS@book> alter session set events 'immediate trace name heapdump_addr level 2,addr 0x7CB93CE0';
Session altered.

--转储文件:
******************************************************
HEAP DUMP heap name="KGLH0^3650f131"  desc=0x7cb93ce0
extent sz=0xfe8 alt=32767 het=56 rec=9 flg=2 opc=0
parent=0x60001190 owner=0x7cb93c90 nex=(nil) xsz=0xfd0 heap=(nil)
fl2=0x26, nex=(nil), dsxvers=1, dsxflg=0x0
dsx first ext=0x7be198c0
EXTENT 0 addr=0x7be198c0
  Chunk        07be198d0 sz=       80    perm      "perm           "  alo=80
Dump of memory from 0x000000007BE198D0 to 0x000000007BE19920
07BE198D0 00000051 40B38F00 00000000 00000000  [Q......@........]
07BE198E0 00000000 00000000 00000050 00000000  [........P.......]
07BE198F0 00000001 C0B38F00 00000000 00000000  [................]
07BE19900 7BE1A508 00000000 7CB93D58 00000000  [...{....X=.|....]
07BE19910 00000001 00000000 7BE198C0 00000000  [...........{....]
  Chunk        07be19920 sz=     3032    perm      "perm           "  alo=2360
Dump of memory from 0x000000007BE19920 to 0x000000007BE1A4F8
07BE19920 00000BD9 40B38F00 7BE198D0 00000000  [.......@...{....]
07BE19930 7BE198D0 00000000 00000938 00000000  [...{....8.......]
07BE19940 7CAB4BA8 00000000 7BE1A160 00000000  [.K.|....`..{....]
07BE19950 00000000 00000000 7CB93C90 00000000  [.........<.|....]
07BE19960 00000000 00000000 00000000 00000000  [................]
...

----很长截取其中1部分.

$ grep "Chunk"  /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_44313.trc
  Chunk        07be198d0 sz=       80    perm      "perm           "  alo=80
  Chunk        07be19920 sz=     3032    perm      "perm           "  alo=2360
  Chunk        07be1a4f8 sz=      736    free      "               "
  Chunk        07be1a7d8 sz=      152    freeable  "kgltbtab       "
  Chunk        07be1a870 sz=       32    freeable  "kksfbc:hash1   "
  Chunk        07be1a4f8 sz=      736    free      "               "
  Chunk        07be198f0 sz=        0    kghdsx
  Chunk        07be19920 sz=     3032    perm      "perm           "  alo=2360
  Chunk        07be198d0 sz=       80    perm      "perm           "  alo=80


--使用大师tanelpoder的包看看里面个个部分大小:


SYS@book>  @ &r/tpt/curheaps 911274289 %
old  20:        KGLNAHSH in (&1)
new  20:        KGLNAHSH in (911274289)
old  21: and    KGLOBT09 like ('&2')
new  21: and    KGLOBT09 like ('%')
  KGLNAHSH KGLHDPAR             CHILD# KGLHDADR         KGLOBHD0            SIZE0    SIZE1    SIZE2    SIZE3 KGLOBHD4            SIZE4    SIZE5 KGLOBHD6            SIZE6    SIZE7     STATUS
---------- ---------------- ---------- ---------------- ---------------- -------- -------- -------- -------- ---------------- -------- -------- ---------------- -------- -------- ----------
911274289 000000007CAB4BA8          0 000000007C56A510 000000007CE32168     4488        0        0        0 00                      0        0 000000007BE1A000    12144        0          1
911274289 000000007CAB4BA8      65535 000000007CAB4BA8 000000007CB93CE0     4720        0        0        0 00                      0        0 00                      0        0          1

old  10:     KSMCHDS = hextoraw('&v_curheaps_kglobhd0')
new  10:     KSMCHDS = hextoraw('000000007CB93CE0')
HEAP  CLASS    ALLOC_COMMENT         BYTES     CHUNKS
----- -------- ---------------- ---------- ----------
HEAP0 perm     permanent memor        3112          2
HEAP0 free     free memory             736          1
HEAP0 freeabl  kgltbtab                152          1
HEAP0 freeabl  kksfbc:hash1             32          1

old  10:     KSMCHDS = hextoraw('&v_curheaps_kglobhd4')
new  10:     KSMCHDS = hextoraw('00')

no rows selected

old  10:     KSMCHDS = hextoraw('&v_curheaps_kglobhd6')
new  10:     KSMCHDS = hextoraw('00')

no rows selected

--可以发现里面的大小都可以对上. 3112=3032+80. 
-- 80+3032+736+152+32=4032 , 4096-4032=64 相差64字节.
-- 不过 select a.* from x$ksmsp a where a.ksmchpar='000000007CB93CE0'; 的输出 KSMCHPTR= 000000007BE19890 ,如果你看下面的输出最小KSMCHPTR=000000007BE198D0.
-- 比较后面2位 0xd0  = 208  0x90 = 144, 208-144=64 正好相差64字节. 也就是输出没有包括头部的64字节.

--访问x$ksmhp有点奇怪,如果直接打入:
SYS@book> select * from x$ksmhp;
no rows selected

SYS@book> select * from x$ksmhp where KSMCHDS = hextoraw('000000007CB93CE0');
ADDR                   INDX    INST_ID KSMCHDS          KSMCHCOM         KSMCHPTR           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR         KSMCHOWN
---------------- ---------- ---------- ---------------- ---------------- ---------------- ---------- -------- ---------- ---------------- ----------------
00007F666D73B838          0          1 000000007CB93CE0 kksfbc:hash1     000000007BE1A870         32 freeabl           0 00               000000007CB93C90
00007F666D73B7E0          1          1 000000007CB93CE0 kgltbtab         000000007BE1A7D8        152 freeabl           0 00               000000007CB93C90
00007F666D73B788          2          1 000000007CB93CE0 free memory      000000007BE1A4F8        736 free              0 00               000000007CB93C90
00007F666D73B730          3          1 000000007CB93CE0 permanent memor  000000007BE19920       3032 perm              0 00               000000007CB93C90
00007F666D73B6D8          4          1 000000007CB93CE0 permanent memor  000000007BE198D0         80 perm              0 00               000000007CB93C90


--附上curheaps.sql的脚本.
--------------------------------------------------------------------------------
--
-- File name:   curheaps.sql
-- Purpose:     Show main cursor data block heap sizes and their contents
--              (heap0 and heap6)
--
-- Author:      Tanel Poder
-- Copyright:   (c) http://www.tanelpoder.com
--
-- Usage:       @curheaps <hash_value> <child#>
--
--              @curheaps 942515969 %   -- shows a summary of cursor heaps
--              @curheaps 942515969 0   -- shows detail for child cursor 0
--
-- Other:       "Child" cursor# 65535 is actually the parent cursor
--
--------------------------------------------------------------------------------

col curheaps_size0 heading SIZE0 for 9999999
col curheaps_size1 heading SIZE1 for 9999999
col curheaps_size2 heading SIZE2 for 9999999
col curheaps_size3 heading SIZE3 for 9999999
col curheaps_size4 heading SIZE4 for 9999999
col curheaps_size5 heading SIZE5 for 9999999
col curheaps_size6 heading SIZE6 for 9999999
col curheaps_size7 heading SIZE7 for 9999999

col KGLOBHD0 new_value v_curheaps_kglobhd0 print
col KGLOBHD1 new_value v_curheaps_kglobhd1 noprint
col KGLOBHD2 new_value v_curheaps_kglobhd2 noprint
col KGLOBHD3 new_value v_curheaps_kglobhd3 noprint
col KGLOBHD4 new_value v_curheaps_kglobhd4 print
col KGLOBHD5 new_value v_curheaps_kglobhd5 noprint
col KGLOBHD6 new_value v_curheaps_kglobhd6 print
col KGLOBHD7 new_value v_curheaps_kglobhd7 noprint


select
    KGLNAHSH,
    KGLHDPAR,
    kglobt09 CHILD#,
    KGLHDADR,
    KGLOBHD0, KGLOBHS0 curheaps_size0,
    KGLOBHD1, KGLOBHS1 curheaps_size1,
    KGLOBHD2, KGLOBHS2 curheaps_size2,
    KGLOBHD3, KGLOBHS3 curheaps_size3,
    KGLOBHD4, KGLOBHS4 curheaps_size4,
    KGLOBHD5, KGLOBHS5 curheaps_size5,
    KGLOBHD6, KGLOBHS6 curheaps_size6,
    KGLOBHD7, KGLOBHS7 curheaps_size7,
--  KGLOBT00 CTXSTAT,
    KGLOBSTA STATUS
from
    X$KGLOB
--  X$KGLCURSOR_CHILD
where
    KGLNAHSH in (&1)
and KGLOBT09 like ('&2')
order by
        KGLOBT09 ASC
/

-- Cursor data block summary
select
   'HEAP0'        heap
  , ksmchcls      class
  , ksmchcom      alloc_comment
  , sum(ksmchsiz) bytes
  , count(*)      chunks
from
    x$ksmhp
where
    KSMCHDS = hextoraw('&v_curheaps_kglobhd0')
group by
   'HEAP0'
  , ksmchcls
  , ksmchcom
order by
    sum(ksmchsiz) desc
/

select
   'HEAP4'        heap
  , ksmchcls      class
  , ksmchcom      alloc_comment
  , sum(ksmchsiz) bytes
  , count(*)      chunks
from
    x$ksmhp
where
    KSMCHDS = hextoraw('&v_curheaps_kglobhd4')
group by
   'HEAP4'
  , ksmchcls
  , ksmchcom
order by
    sum(ksmchsiz) desc
/

 

select
   'HEAP6'        heap
  , ksmchcls      class
  , ksmchcom      alloc_comment
  , sum(ksmchsiz) bytes
  , count(*)      chunks
from
    x$ksmhp
where
    KSMCHDS = hextoraw('&v_curheaps_kglobhd6')
group by
   'HEAP6'
  , ksmchcls
  , ksmchcom
order by
    sum(ksmchsiz) desc
/
-- Cursor data block details

-- select * from x$ksmhp where KSMCHDS = hextoraw('&v_curheaps_kglobhd0');
-- select * from x$ksmhp where KSMCHDS = hextoraw('&v_curheaps_kglobhd6');

目录
相关文章
|
5天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL隐式游标:数据的“自动导游”与“轻松之旅”
【4月更文挑战第19天】Oracle PL/SQL中的隐式游标是自动管理的数据导航工具,简化编程工作,尤其适用于简单查询和DML操作。它自动处理数据访问,提供高效、简洁的代码,但不适用于复杂场景。显式游标在需要精细控制时更有优势。了解并适时使用隐式游标,能提升数据处理效率,让开发更加轻松。
|
5天前
|
存储 SQL 数据库
数据库sql语句-----游标和存储过程
数据库sql语句-----游标和存储过程
14 1
|
5天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标自定义异常:数据探险家的“专属警示灯”
【4月更文挑战第19天】Oracle PL/SQL中的游标自定义异常是处理数据异常的有效工具,犹如数据探险家的警示灯。通过声明异常名(如`LOW_SALARY_EXCEPTION`)并在满足特定条件(如薪资低于阈值)时使用`RAISE`抛出异常,能灵活应对复杂业务规则。示例代码展示了如何在游标操作中定义和捕获自定义异常,提升代码可读性和维护性,确保在面对数据挑战时能及时响应。掌握自定义异常,让数据管理更从容。
|
5天前
|
SQL Oracle 安全
Oracle的PL/SQL游标异常处理:从“惊涛骇浪”到“风平浪静”
【4月更文挑战第19天】Oracle PL/SQL游标异常处理确保了在数据操作中遇到的问题得以优雅解决,如`NO_DATA_FOUND`或`TOO_MANY_ROWS`等异常。通过使用`EXCEPTION`块捕获并处理这些异常,开发者可以防止程序因游标问题而崩溃。例如,当查询无结果时,可以显示定制的错误信息而不是让程序终止。掌握游标异常处理是成为娴熟的Oracle数据管理员的关键,能保证在复杂的数据环境中稳健运行。
|
5天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL中FOR语句循环游标的奇幻之旅
【4月更文挑战第19天】在Oracle PL/SQL中,FOR语句与游标结合,提供了一种简化数据遍历的高效方法。传统游标处理涉及多个步骤,而FOR循环游标自动处理细节,使代码更简洁、易读。通过示例展示了如何使用FOR循环游标遍历员工表并打印姓名和薪资,对比传统方式,FOR语句不仅简化代码,还因内部优化提升了执行效率。推荐开发者利用这一功能提高工作效率。
|
5天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
5天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL显式游标:数据的“私人导游”与“定制之旅”
【4月更文挑战第19天】Oracle PL/SQL中的显式游标提供灵活精确的数据访问,与隐式游标不同,需手动定义、打开、获取和关闭。通过DECLARE定义游标及SQL查询,OPEN启动查询,FETCH逐行获取数据,CLOSE释放资源。显式游标适用于复杂数据处理,但应注意SQL效率、游标管理及异常处理。它是数据海洋的私人导游,助力实现业务逻辑和数据探险。
|
5天前
|
SQL 存储 Oracle
Oracle的PL/SQL游标:数据的“探秘之旅”与“寻宝图”
【4月更文挑战第19天】Oracle PL/SQL游标是数据探索的关键工具,用于逐行访问结果集。它的工作原理包括定义、打开、FETCH和关闭,允许灵活处理数据。游标有隐式和显式两种类型,适用于不同场景,且支持参数化以增强灵活性。尽管游标在数据处理中不可或缺,但过度使用可能影响性能,因此需谨慎优化。掌握游标技巧,能有效实现业务逻辑,开启数据世界的探秘之旅。
|
5天前
|
SQL 存储 Perl
PL/SQL的游标
PL/SQL的游标
27 2
|
5天前
|
存储 SQL Oracle