[20211221]提示precompute_subquery补充2.txt --//前几天测试提示precompute_subquery,发现使用它的缺点: --//1每次运行都产生1个新的子光标,每次都是一次"硬分析"。 --//2.使用范围很窄,一旦内层使用绑定变量,提示失效。 --//其实每次都是硬解析很好理解,毕竟每次运行可能内层算出的值不同,可以查询fliter或者access条件确定. --//测试看看这些值在子光标的什么位置,堆0还是堆6. --//我以前做过测试绑定变量的值在子光标堆0中,而这些值是fliter或者access条件,猜测应该在堆6,也就是执行计划里面. --//参考链接 [20191213]共享池绑定变量的值在哪里.txt --//理论讲按照以前的测试,应该在堆6,测试看看。 1.环境: SCOTT@book> @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 2.测试1: SCOTT@book> create table deptx as select * from dept; Table created. SCOTT@book> select * from dept where dname in (select /*+ precompute_subquery */ dname from deptx where deptno=30); DEPTNO DNAME LOC ---------- -------------- ------------- 30 SALES CHICAGO --//sql_id=b72msdh4r55yc,deptno=30,带入dname的值是SALES. SYS@book> @ sharepool/shp4 b72msdh4r55yc 0 TEXT KGLHDADR KGLHDPAR C40 KGLHDLMD KGLHDPMD KGLHDIVC KGLOBHD0 KGLOBHD6 KGLOBHS0 KGLOBHS6 KGLOBT16 N0_6_16 N20 KGLNAHSH KGLOBT03 KGLOBT09 --------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ---------- child handle address 000000007C1F0CC8 000000007E366B80 select * from dept where dname in (selec 1 0 0 000000007E364B78 000000007EA43F88 4528 12144 3135 19807 19807 158504908 b72msdh4r55yc 0 parent handle address 000000007E366B80 000000007E366B80 select * from dept where dname in (selec 1 0 0 000000007D2B2A58 00 4784 0 0 4784 4784 158504908 b72msdh4r55yc 65535 ) SYS@book> oradebug setmypid Statement processed. SYS@book> @ti New tracefile_identifier = /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_26919_0001.trc SYS@book> oradebug dump heapdump_addr 2 0x000000007E364B78 Statement processed. SYS@book> @ ti New tracefile_identifier = /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_26919_0002.trc SYS@book> oradebug dump heapdump_addr 2 0x000000007EA43F88 Statement processed. --//检查发现: $ grep -i SALES /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_26919_0001.trc $ grep -i SALES /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_26919_0002.trc 07E1D9C70 0A64A9B0 00000000 454C4153 00000053 [..d.....SALES...] 07E1DAAE0 454C4153 00000053 [SALES...] 07E1DAB00 454C4153 00000053 00000000 00000000 [SALES...........] --//可以大致确定在堆6. --//在换一个语句: SCOTT@book> select deptno,loc from dept where dname in (select /*+ precompute_subquery */ dname from deptx where deptno in (10,30)); DEPTNO LOC ---------- ------------- 10 NEW YORK 30 CHICAGO --//sql_id=6m03r797wymw2.dname = ACCOUNTING,SALES SYS@book> @ sharepool/shp4 6m03r797wymw2 0 TEXT KGLHDADR KGLHDPAR C40 KGLHDLMD KGLHDPMD KGLHDIVC KGLOBHD0 KGLOBHD6 KGLOBHS0 KGLOBHS6 KGLOBT16 N0_6_16 N20 KGLNAHSH KGLOBT03 KGLOBT09 --------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ---------- child handle address 000000007D8440C0 000000007D44A910 select deptno,loc from dept where dname 1 0 0 000000007D44A858 000000007BED0EC8 4528 12144 3152 19824 19824 1338986370 6m03r797wymw2 0 parent handle address 000000007D44A910 000000007D44A910 select deptno,loc from dept where dname 1 0 0 000000007CD07E78 00 4800 0 0 4800 4800 1338986370 6m03r797wymw2 65535 SYS@book> @ ti New tracefile_identifier = /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_26919_0003.trc SYS@book> oradebug dump heapdump_addr 2 0x000000007BED0EC8 Statement processed. $ egrep -n -C6 "SALES|ACCO" /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_26919_0003.trc | egrep "Chunk|SALES|ACCO" 302- Chunk 07c78fb88 sz= 32 freeable "ub1[]: qkexrXfo" 306:07C78FBA0 454C4153 00000053 [SALES...] 307- Chunk 07c78fba8 sz= 88 freeable "opn: qkexrInitO" 325- Chunk 07c78fc80 sz= 40 freeable "ub1[]: qkexrXfo" 328:07C78FC90 0A64A9B0 00000000 4F434341 49544E55 [..d.....ACCOUNTI] 330- Chunk 07c78fca8 sz= 88 freeable "opn: qkexrInitO" 646- Chunk 07c6f2810 sz= 32 freeable "strdef_buf : kk" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649:07C6F2820 0A766B5C 00000000 454C4153 00000053 [\kv.....SALES...] 650- Chunk 07c6f2830 sz= 120 freeable "optdef: qcopCre" 660- Chunk 07c6f28a8 sz= 40 freeable "strdef_buf : kk" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664:07C6F28C0 4F434341 49544E55 0000474E 00000000 [ACCOUNTING......] 665- Chunk 07c6f28d0 sz= 40 freeable "strdef_buf : kk" 668:07C6F28E0 0A766B5C 00000000 454C4153 49544E53 [\kv.....SALESNTI] 670- Chunk 07c6f28f8 sz= 80 freeable "ctxqrol : kkqsr" --//猜测这两个chunk用来接受过滤值。总之在堆6信息里面。 3.测试2: --//前面的测试知道变量的位置,既然内层展开后直接带入带入,如果参数很多,相应的堆占用内存空间很大. SCOTT@book> create table tx as select object_id deptno from all_objects; Table created. SCOTT@book> @ gts tx Gather Table Statistics for table tx... PL/SQL procedure successfully completed. SCOTT@book> select * from dept where deptno in (select /*+ PRECOMPUTE_SUBQUERY */ deptno from tx where rownum<=10000); DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON --//sql_id=1xzm1bn3ru86q.传入10000个参数值,看看堆6占用空间. SYS@book> @ sharepool/shp4 1xzm1bn3ru86q 0 TEXT KGLHDADR KGLHDPAR C40 KGLHDLMD KGLHDPMD KGLHDIVC KGLOBHD0 KGLOBHD6 KGLOBHS0 KGLOBHS6 KGLOBT16 N0_6_16 N20 KGLNAHSH KGLOBT03 KGLOBT09 --------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ---------- child handle address 000000007E1B10B8 000000007E1B1538 select * from dept where deptno in (sel 1 0 0 000000007E1B1000 000000007DED5E20 4488 4115824 3139 4123451 4123451 125640918 1xzm1bn3ru86q 0 parent handle address 000000007E1B1538 000000007E1B1538 select * from dept where deptno in (sel 1 0 0 000000007E1B1480 00 4800 0 0 4800 4800 125640918 1xzm1bn3ru86q 65535 --//注意看KGLOBHS6占用的大小达到了4115824. SYS@book> select count(*),sum(KSMCHSIZ),avg(KSMCHSIZ) from x$ksmsp a where a.ksmchpar=hextoraw('000000007DED5E20'); COUNT(*) SUM(KSMCHSIZ) AVG(KSMCHSIZ) ---------- ------------- ------------- 996 4155688 4172.37751 --//占用996个chunk,平均大小4172. 当然我带入的参数数量达到10000不是1000,如果像平时的1000,至少也消耗4123451/10 = 412345.1,大约410K。 --//可以看出实际上precompute_subquery使用范围很窄,缺点多多。 SYS@book> @ curheaps.sql 125640918 0 KGLNAHSH KGLHDPAR SQL_ID CHILD# KGLHDADR KGLOBHD0 SIZE0 SIZE1 SIZE2 SIZE3 KGLOBHD4 SIZE4 SIZE5 KGLOBHD6 SIZE6 SIZE7 STATUS ---------- ---------------- ------------- ---------- ---------------- ---------------- -------- -------- -------- -------- ---------------- -------- -------- ---------------- -------- -------- ---------- 125640918 000000007E1B1538 1xzm1bn3ru86q 0 000000007E1B10B8 000000007E1B1000 4488 0 0 0 00 0 0 000000007DED5E20 4115824 0 1 HEAP CLASS ALLOC_COMMENT BYTES CHUNKS ----- -------- ---------------- ---------- ---------- HEAP0 perm permanent memor 2672 2 HEAP0 free free memory 752 1 HEAP0 freeabl kgltbtab 608 4 no rows selected HEAP CLASS ALLOC_COMMENT BYTES CHUNKS ----- -------- ---------------- ---------- ---------- HEAP6 freeabl qeeOpt: qeesCre 1360264 10002 HEAP6 freeabl optdef: qcopCre 1201200 10000 HEAP6 freeabl opn: qkexrInitO 890104 10005 HEAP6 freeabl ub1[]: qkexrXfo 326264 10000 HEAP6 freeabl strdef_buf : kk 323680 10001 HEAP6 freeabl kksol : kksnsg 5056 79 HEAP6 freeabl kctdef : qcdlgo 1224 3 HEAP6 freeabl ctxdef:kksLoadC 936 1 HEAP6 free free memory 776 1 HEAP6 freeabl kccdef: qkxrMem 672 3 HEAP6 freeabl idndef : qcuAll 560 14 HEAP6 freeabl audRegFro:audta 544 4 HEAP6 freeabl opixpop:kctdef 400 1 HEAP6 freeabl kctdef : qcsfps 400 1 HEAP6 freeabl qertbs:qertbIAl 360 1 HEAP6 freeabl chedef : qcuatc 240 6 HEAP6 freeabl pqctx:kkfdParal 232 1 HEAP6 freeabl idndef*[]: qkex 224 4 HEAP6 freeabl kggsmInitCompac 184 5 HEAP6 freeabl ctxqrol : kkqsr 160 2 HEAP6 freeabl qcctx : kkmqccr 152 1 HEAP6 freeabl kggsmCommonInit 144 1 HEAP6 freeabl qeSel: qkxrXfor 144 3 HEAP6 freeabl kksol : kkscuf 128 2 HEAP6 freeabl kafco : qkacol 120 1 HEAP6 freeabl opiprwd : opitc 104 1 HEAP6 freeabl ktamd : ktagmd 96 2 HEAP6 freeabl qkaapd : qkaqkn 96 1 HEAP6 freeabl ctxPlanSig:qksc 88 1 HEAP6 freeabl KGHSC_ALLOC_BUF 88 1 HEAP6 freeabl qcpctx: kkmqccr 80 1 HEAP6 freeabl qertbAllocatePa 80 1 HEAP6 perm permanent memor 80 1 HEAP6 freeabl kggsmInit:sm 80 1 HEAP6 freeabl qcsctx: kkmqccr 72 1 HEAP6 freeabl qksmm: qksmmCs 72 1 HEAP6 freeabl kobjn : kkdcchs 64 2 HEAP6 freeabl unmdef in opipr 64 1 HEAP6 freeabl cxach : opiSem 64 1 HEAP6 freeabl qeeRwo: qeeCrea 56 1 HEAP6 freeabl qcmemctx : kkmq 56 1 HEAP6 freeabl kggac: kggacCre 56 1 HEAP6 freeabl qksrcMarkQB:qks 48 1 HEAP6 freeabl kksoff : opitca 48 1 HEAP6 freeabl qctctx: kkmqccr 48 1 HEAP6 freeabl qkaEnableWide:c 40 1 HEAP6 freeabl qesmaInitTblCtx 40 1 HEAP6 freeabl qcptgc: kkmqccr 40 1 HEAP6 freeabl opixfalo:froaty 32 1 HEAP6 freeabl opixfalo:ctxkct 32 1 HEAP6 freeabl xplGenXpl:planL 32 1 51 rows selected. --//等上一小会,让子光标堆6空间释放. SYS@book> @ sharepool/shp4 1xzm1bn3ru86q 0 TEXT KGLHDADR KGLHDPAR C40 KGLHDLMD KGLHDPMD KGLHDIVC KGLOBHD0 KGLOBHD6 KGLOBHS0 KGLOBHS6 KGLOBT16 N0_6_16 N20 KGLNAHSH KGLOBT03 KGLOBT09 --------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ---------- child handle address 000000007E1B10B8 000000007E1B1538 select * from dept where deptno in (sel 1 0 0 000000007E1B1000 00 4488 0 3139 7627 7627 125640918 1xzm1bn3ru86q 0 parent handle address 000000007E1B1538 000000007E1B1538 select * from dept where deptno in (sel 1 0 0 000000007E1B1480 00 4800 0 0 4800 4800 125640918 1xzm1bn3ru86q 65535 SYS@book> select count(*),sum(KSMCHSIZ),avg(KSMCHSIZ) from x$ksmsp a where a.ksmchpar=hextoraw('000000007DED5E20'); COUNT(*) SUM(KSMCHSIZ) AVG(KSMCHSIZ) ---------- ------------- ------------- 0 --//共享内存已经释放子光标0的堆6占用空间。再次执行: SCOTT@book> select * from dept where deptno in (select /*+ PRECOMPUTE_SUBQUERY */ deptno from tx where rownum<=10000); DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON SYS@book> @ sharepool/shp4 1xzm1bn3ru86q 0 TEXT KGLHDADR KGLHDPAR C40 KGLHDLMD KGLHDPMD KGLHDIVC KGLOBHD0 KGLOBHD6 KGLOBHS0 KGLOBHS6 KGLOBT16 N0_6_16 N20 KGLNAHSH KGLOBT03 KGLOBT09 --------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ---------- child handle address 000000007E1B10B8 000000007E1B1538 select * from dept where deptno in (sel 1 0 0 000000007E1B1000 000000007DED5E20 4488 4115808 3139 4123435 4123435 125640918 1xzm1bn3ru86q 0 parent handle address 000000007E1B1538 000000007E1B1538 select * from dept where deptno in (sel 1 0 0 000000007E1B1480 00 4800 0 0 4800 4800 125640918 1xzm1bn3ru86q 65535 --//堆6的地址描述符没有变还是000000007DED5E20。 SYS@book> select count(*),sum(KSMCHSIZ),avg(KSMCHSIZ) from x$ksmsp a where a.ksmchpar=hextoraw('000000007DED5E20'); COUNT(*) SUM(KSMCHSIZ) AVG(KSMCHSIZ) ---------- ------------- ------------- 996 4155672 4172.36145 SYS@book> @ heap6.sql 1xzm1bn3ru86q CHUNK_COM ALLOC_CL TOTSIZE COUNT(*) DIFF_SIZES AVGSZ MINSZ MAXSZ ---------------- -------- ---------- ---------- ---------- ---------- ---------- ---------- qeeOpt: qeesCre freeabl 1360240 10002 2 136 128 80112 optdef: qcopCre freeabl 1201200 10000 2 120 120 136 opn: qkexrInitO freeabl 890112 10005 3 89 88 120 ub1[]: qkexrXfo freeabl 326320 10000 3 33 32 56 strdef_buf : kk freeabl 323680 10001 4 32 32 64 kksol : kksnsg freeabl 5056 79 1 64 64 64 kctdef : qcdlgo freeabl 1224 3 2 408 400 424 ctxdef:kksLoadC freeabl 936 1 1 936 936 936 free memory free 720 1 1 720 720 720 kccdef: qkxrMem freeabl 672 3 1 224 224 224 idndef : qcuAll freeabl 560 14 1 40 40 40 audRegFro:audta freeabl 544 4 1 136 136 136 opixpop:kctdef freeabl 400 1 1 400 400 400 kctdef : qcsfps freeabl 400 1 1 400 400 400 qertbs:qertbIAl freeabl 360 1 1 360 360 360 chedef : qcuatc freeabl 240 6 1 40 40 40 pqctx:kkfdParal freeabl 232 1 1 232 232 232 idndef*[]: qkex freeabl 224 4 1 56 56 56 kggsmInitCompac freeabl 184 5 3 37 32 48 ctxqrol : kkqsr freeabl 160 2 1 80 80 80 qcctx : kkmqccr freeabl 152 1 1 152 152 152 kggsmCommonInit freeabl 144 1 1 144 144 144 qeSel: qkxrXfor freeabl 144 3 1 48 48 48 kksol : kkscuf freeabl 128 2 1 64 64 64 kafco : qkacol freeabl 120 1 1 120 120 120 opiprwd : opitc freeabl 104 1 1 104 104 104 ktamd : ktagmd freeabl 96 2 1 48 48 48 qkaapd : qkaqkn freeabl 96 1 1 96 96 96 KGHSC_ALLOC_BUF freeabl 88 1 1 88 88 88 ctxPlanSig:qksc freeabl 88 1 1 88 88 88 kggsmInit:sm freeabl 80 1 1 80 80 80 permanent memor perm 80 1 1 80 80 80 qertbAllocatePa freeabl 80 1 1 80 80 80 qcpctx: kkmqccr freeabl 80 1 1 80 80 80 qksmm: qksmmCs freeabl 72 1 1 72 72 72 qcsctx: kkmqccr freeabl 72 1 1 72 72 72 unmdef in opipr freeabl 64 1 1 64 64 64 kobjn : kkdcchs freeabl 64 2 1 32 32 32 cxach : opiSem freeabl 64 1 1 64 64 64 qcmemctx : kkmq freeabl 56 1 1 56 56 56 kggac: kggacCre freeabl 56 1 1 56 56 56 qeeRwo: qeeCrea freeabl 56 1 1 56 56 56 qksrcMarkQB:qks freeabl 48 1 1 48 48 48 kksoff : opitca freeabl 48 1 1 48 48 48 qctctx: kkmqccr freeabl 48 1 1 48 48 48 qcptgc: kkmqccr freeabl 40 1 1 40 40 40 qesmaInitTblCtx freeabl 40 1 1 40 40 40 qkaEnableWide:c freeabl 40 1 1 40 40 40 opixfalo:froaty freeabl 32 1 1 32 32 32 xplGenXpl:planL freeabl 32 1 1 32 32 32 opixfalo:ctxkct freeabl 32 1 1 32 32 32 51 rows selected. --//顺便贴一个生产系统in 有100个值的语句。 > @ sharepool/shp4 b23m1hg6cm11f 0 KGLHDADR KGLHDPAR KGLHDLMD KGLHDPMD KGLHDIVC KGLOBHD0 KGLOBHD6 KGLOBHS0 KGLOBHS6 KGLOBT16 N0_6_16 N20 KGLNAHSH KGLOBT03 KGLOBT09 --------------------- ---------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ---------- child handle address 0000001053F2CE50 0 0 0 000000105A0AACD0 00000010F8A29BC8 20816 109488 9548 139852 139852 3435758638 b23m1hg6cm11f 0 parent handle address 0000001053F2CE50 0 0 0 000000105D4AE0C8 00 12529 0 0 12529 12529 3435758638 b23m1hg6cm11f 65535 --//堆6 109488 3.总结: 总之一点不实用。 heap6.sql,curheaps.sql来之tpt包。 $ cat sharepool/shp4.sql column N0_6_16 format 99999999 SELECT DECODE (kglhdadr, kglhdpar, 'parent handle address', 'child handle address') text, kglhdadr, kglhdpar, substr(kglnaobj,1,40) c40, KGLHDLMD, KGLHDPMD, kglhdivc, kglobhd0, kglobhd6, kglobhs0,kglobhs6,kglobt16, kglobhs0+kglobhs6+kglobt16 N0_6_16, kglobhs0+kglobhs1+kglobhs2+kglobhs3+kglobhs4+kglobhs5+kglobhs6+kglobt16 N20, kglnahsh, kglobt03 , kglobt09 FROM x$kglob WHERE kglobt03 = '&1' or kglhdpar='&1' or kglhdadr='&1' or KGLNAHSH= &2;
[20211221]提示precompute_subquery补充2.txt
来源:这里教程网
时间:2026-03-03 17:20:51
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 连上无线网却不能上网?为你解答
连上无线网却不能上网?为你解答
26-03-03 - databas如何避免重复故障
databas如何避免重复故障
26-03-03 - database(Oracle MySQL)查询速度和数据量有关系吗?
database(Oracle MySQL)查询速度和数据量有关系吗?
26-03-03 - Oracle clone database
Oracle clone database
26-03-03 - 系统进程是什么?怎么通过系统进程进行病毒分析?
系统进程是什么?怎么通过系统进程进行病毒分析?
26-03-03 - Oracle意外发现PDB适合微服务和中台
Oracle意外发现PDB适合微服务和中台
26-03-03 - Oracle的特性分页
Oracle的特性分页
26-03-03 - Oracle的压测
Oracle的压测
26-03-03 - Oracle 隐藏列
Oracle 隐藏列
26-03-03 - oracle位图索引对DML操作的影响
oracle位图索引对DML操作的影响
26-03-03
