[20250418]绑定变量太多的分析(21c).txt --//前几天测试,执行绑定变量很多的sql语句,发现无法看出在绑定变量替换时,执行"缓慢"的原因,没有相关等待事件。 --//再次尝试分析这种情况: 1.环境: SCOTT@book01p> @ ver2 ============================== PORT_STRING : x86_64/Linux 2.4.xx VERSION : 21.0.0.0.0 BANNER : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production BANNER_FULL : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Version 21.3.0.0.0 BANNER_LEGACY : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production CON_ID : 0 PL/SQL procedure successfully completed. 2.建立测试环境: create table t as select * from all_objects; create unique index i_t_object_id on t(object_id); --//分析略。 $ cat a.txt set pagesize 0 set head off set feedback off set verify off set timing off spool b1.txt select 'set termout off' from dual; select 'variable b'||to_char(level)||' number;' from dual connect by level<=&1; select 'begin' from dual; select ':b'||to_char(level)||' :='|| to_char(level)||';' from dual connect by level<=&1; select 'end;' from dual; select '/' from dual ; select 'set termout on' txt from dual; spool off spool b2.txt --select 'set timing on' txt from dual; select 'select count(data_object_id) from t where (1,object_id) in (' txt from dual ; select '(1,:b'||to_char(level)||'),' txt from dual connect by level<=&&1 -1 ; select '(1,:b'||to_char(&&1)||'));' txt from dual ; --select 'set timing off' txt from dual; spool off set pagesize 9999 set head on set feedback on SCOTT@book01p> @ a.txt 1000 --//输出略。这样建立2个文本b1.txt,b2.txt . --//采用集合的比较,这样可以突破in list 1000个值的限制。 3.分析: SCOTT@book01p> @ spid ============================== SID : 16 SERIAL# : 56356 PROCESS : 4086 SERVER : DEDICATED SPID : 4088 PID : 64 P_SERIAL# : 4 KILL_COMMAND : alter system kill session '16,56356' immediate; PL/SQL procedure successfully completed. SCOTT@book01p> @ a.txt 1000 SCOTT@book01p> @ b1.txt SCOTT@book01p> @ b2.txt COUNT(DATA_OBJECT_ID) --------------------- 824 $ uniq -c loop5x.txt 10099 / SCOTT@book01p> @ loop5x.txt --//打开另外session,执行如下: SYS@book> @ ost 16 0 20000 -- oStackProf v1.2 - EXPERIMENTAL script by Tanel Poder ( https://tanelpoder.com ) WARNING! This script can crash the target process on Oracle 9.2 on Windows and maybe other versions/platforms as well. Test this script out thorouhgly in your dev environment first! Hit CTRL+C to cancel, ENTER to continue... Sampling... --//按ctrl+c中断。 --//简单说明就是执行oradebug setospid <spid>,不断调用oradebug short_stack,收集stack信息。 --//脚本原始来源 Tanel Poder,最后调用python分析,我的python可能版本太低执行报错,我取消了最后python的执行。 $ sort ostackprof_4088.txt| uniq -c | sort -nr >| aaa.txt $ head -6 aaa.txt 7418 ksedsts()+418<-ksdxcb()+2187<-sspuser()+213<-__sighandler()<-read()+14<-read()+85<-snttread()+16<-nttfprd()+293<-nsbasic_brc()+357<-nioqrc()+495<-opikndf2()+1078<-opitsk()+920<-opiino()+1008<-opiodr()+1256<-opidrv()+1067<-sou2o()+165<-opimai_real()+400<-ssthrdmain()+412<-main()+292<-__libc_start_main()+245 188 ksedsts()+418<-ksdxcb()+2187<-sspuser()+213<-__sighandler()<-read()+16<-read()+85<-snttread()+16<-nttfprd()+293<-nsbasic_brc()+357<-nioqrc()+495<-opikndf2()+1078<-opitsk()+920<-opiino()+1008<-opiodr()+1256<-opidrv()+1067<-sou2o()+165<-opimai_real()+400<-ssthrdmain()+412<-main()+292<-__libc_start_main()+245 17 ksedsts()+418<-ksdxcb()+2187<-sspuser()+213<-__sighandler()<-write()+16<-snttwrite()+16<-nttfpwr()+215<-nsbasic_bsd()+416<-nioqrc()+300<-opikndf2()+1078<-opitsk()+920<-opiino()+1008<-opiodr()+1256<-opidrv()+1067<-sou2o()+165<-opimai_real()+400<-ssthrdmain()+412<-main()+292<-__libc_start_main()+245 17 ksedsts()+418<-ksdxcb()+2187<-sspuser()+213<-__sighandler()<-opiltc()+436<-kxsBindBufferSetUp()+196<-kxsxsi()+1025<-opiexe()+4791<-kpoal8()+2237<-opiodr()+1256<-ttcpip()+1257<-opitsk()+1906<-opiino()+1008<-opiodr()+1256<-opidrv()+1067<-sou2o()+165<-opimai_real()+400<-ssthrdmain()+412<-main()+292<-__libc_start_main()+245 11 ksedsts()+418<-ksdxcb()+2187<-sspuser()+213<-__sighandler()<-qerilnil()+223<-qerilFetch()+219<-qergsFetchSimple()+7593<-qergsFetch()+263<-opifch2()+3564<-kpoal8()+4232<-opiodr()+1256<-ttcpip()+1257<-opitsk()+1906<-opiino()+1008<-opiodr()+1256<-opidrv()+1067<-sou2o()+165<-opimai_real()+400<-ssthrdmain()+412<-main()+292<-__libc_start_main()+245 7 ksedsts()+418<-ksdxcb()+2187<-sspuser()+213<-__sighandler()<-qetlbr()+940<-qertbFetchByRowID()+6820<-qerilFetch()+143<-qergsFetchSimple()+7593<-qergsFetch()+263<-opifch2()+3564<-kpoal8()+4232<-opiodr()+1256<-ttcpip()+1257<-opitsk()+1906<-opiino()+1008<-opiodr()+1256<-opidrv()+1067<-sou2o()+165<-opimai_real()+400<-ssthrdmain()+412<-main()+292<-__libc_start_main()+245 --//仔细阅读Tanel Poder ,stack_helper.py脚本,应该从__sighandler开始。 --//大部分__sighandler()<-read()+14 的情况,说明绑定变量太多,抓取short_stack的执行堆栈,都是集中在read的调用与执行上. --//不熟悉这类问题的分析,仅仅作为参考。 $ ./lookup.awk ksedsts ksedsts : kernel service error debug dump the call stack short stack $ ./lookup.awk ksdxcb ksdxcb : kernel service debug internal errors ksdx callback for sosd layer signal handler $ ./lookup.awk sspuser sspuser : operating system dependent system process management handle SIGUSR2 for Oracle $ cat ostackprof_4088.txt | sed "s/<-/\n/g" | sort | uniq -c | sort -nr | head -40 9005 opiodr()+1256 8320 ssthrdmain()+412 8320 sspuser()+213 8320 sou2o()+165 8320 __sighandler() 8320 opimai_real()+400 8320 opiino()+1008 8320 opidrv()+1067 8320 main()+292 8320 __libc_start_main()+245 8320 ksedsts()+418 8320 ksdxcb()+2187 7623 opitsk()+920 7623 opikndf2()+1078 7606 snttread()+16 7606 read()+85 7606 nttfprd()+293 7606 nsbasic_brc()+357 7606 nioqrc()+495 7418 read()+14 693 opitsk()+1906 686 ttcpip()+1257 433 kpoal8()+4232 425 qergsFetch()+263 425 opifch2()+3564 424 qergsFetchSimple()+7593 224 kpoal8()+2237 217 qerilFetch()+143 188 read()+16 175 qerilFetch()+312 165 qertbStart()+2515 117 opiexe()+7793 116 selexe0()+1002 116 qergsStart()+1360 113 qerilStart()+456 111 qerilInitializeInList()+1924 89 qerilSortSingleCol()+403 81 qertbFetchByRowID()+13464 80 qerpfStart()+447 75 qerpfStart()+585 $ cat ostackprof_4088.txt | sed "s/<-/\n/g" | sed "s/+.*$//" |sort | uniq -c | sort -nr | head -40 15212 read() 9006 opiodr() 8320 ssthrdmain() 8320 sspuser() 8320 sou2o() 8320 __sighandler() 8320 opitsk() 8320 opimai_real() 8320 opiino() 8320 opidrv() 8320 main() 8320 __libc_start_main() 8320 ksedsts() 8320 ksdxcb() 7625 opikndf2() 7623 nioqrc() 7606 snttread() 7606 nttfprd() 7606 nsbasic_brc() 693 ttcpip() 685 kpoal8() 433 opifch2() 425 qergsFetchSimple() 425 qergsFetch() 424 qerilFetch() 224 opiexe() 217 qertbFetchByRowID() 178 qertbStart() 164 qerpfStart() 117 selexe0() 116 qerilStart() 116 qergsStart() 113 qerilInitializeInList() 111 qerilSortSingleCol() 89 kgwsins() 81 qerpfFetch() 80 qerpfInit() 75 qerixStart() 74 qerixFetchUniqueIndex() 74 kxsxsi() 4.多个会话同时执行的情况如何: $ sort ostackprof_6361.txt | uniq -c | sort -nr 521 ksedsts()+418<-ksdxcb()+2187<-sspuser()+213<-__sighandler()<-read()+14<-read()+85<-snttread()+16<-nttfprd()+293<-nsbasic_brc()+357<-nioqrc()+495<-opikndf2()+1078<-opitsk()+920<-opiino()+1008<-opiodr()+1256<-opidrv()+1067<-sou2o()+165<-opimai_real()+400<-ssthrdmain()+412<-main()+292<-__libc_start_main()+245 2 ksedsts()+418<-ksdxcb()+2187<-sspuser()+213<-__sighandler()<-read()+16<-read()+85<-snttread()+16<-nttfprd()+293<-nsbasic_brc()+357<-nioqrc()+495<-opikndf2()+1078<-opitsk()+920<-opiino()+1008<-opiodr()+1256<-opidrv()+1067<-sou2o()+165<-opimai_real()+400<-ssthrdmain()+412<-main()+292<-__libc_start_main()+245 --//抓取到的都是以上2行。 $ cat ostackprof_6361.txt | sed "s/<-/\n/g" |sort | uniq -c | sort -nr | head -40 523 ssthrdmain()+412 523 sspuser()+213 523 sou2o()+165 523 snttread()+16 523 __sighandler() 523 read()+85 523 opitsk()+920 523 opiodr()+1256 523 opimai_real()+400 523 opikndf2()+1078 523 opiino()+1008 523 opidrv()+1067 523 nttfprd()+293 523 nsbasic_brc()+357 523 nioqrc()+495 523 main()+292 523 __libc_start_main()+245 523 ksedsts()+418 523 ksdxcb()+2187 521 read()+14 2 read()+16 5.附上修改ost.sql代码: $ cat ost.sql ------------------------------------------------------------------------------------- -- -- File name: oStackProfU.sql ( Oradebug short_Stack Profiler ) -- Purpose: Take target process stack samples and show an execution profile -- -- Author: Tanel Poder -- Copyright: 2008 Tanel Poder. All rights reserved. More info at http://tanelpoder.com -- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions. -- -- Usage: @ostackprofu <sid> <interval> <#samples> -- -- @ostackprofu 148 0 100 -- -- - takes 100 stack samples of server process tied to SID 148 -- with not waiting between samples -- -- @ostackprofu 148 0.1 60 -- - takes 60 stack samples of process tied to sid 148 with 0.1 -- second interval -- -- Updates: Version 1.2 - support also Unix/Mac clients via Python based stack_helper -- -- Other: WARNING!!! This tool is experimental and not meant for use in -- production environments. This is due oradebug short_stack -- being somewhat unstable on some platforms and it has -- event crashed target processes on Windows platforms (9.2) -- -- Use an OS stack sampler instead when need to diagnose -- production issues (and test even those well in dev) -- -- -- Note that this script uses a stack_helper.py Python script for post -- processing oradebug short_stack output. Therefore you need to run -- it on a Unix/Linux/Mac SQLPLUS client with python installed. The -- server can be on any platforms as long as it supports oradebug -- short_stack - 10.2 on Solaris x64 doesn't seem to support it though, -- but you have DTrace there anyway ;) -- ------------------------------------------------------------------------------------- PROMPT PROMPT -- oStackProf v1.2 - EXPERIMENTAL script by Tanel Poder ( https://tanelpoder.com ) PROMPT PROMPT WARNING! This script can crash the target process on Oracle 9.2 on Windows PROMPT and maybe other versions/platforms as well. Test this script out thorouhgly PROMPT in your dev environment first! PAUSE Hit CTRL+C to cancel, ENTER to continue... SET TERMOUT OFF FEEDBACK OFF VERIFY OFF DEF ostackprof_sid=&1 DEF ostackprof_interval=&2 DEF ostackprof_samples=&3 COL spid NEW_VALUE ostackprof_spid SELECT spid FROM v$process WHERE addr = (SELECT /*+ NO_UNNEST */ paddr FROM v$session WHERE sid = &1); COL spid CLEAR ORADEBUG SETOSPID &ostackprof_spid SELECT 'oradebug short_stack'|| DECODE(TO_NUMBER(&ostackprof_interval), 0, '', chr(13)||chr(10)||'exec dbms_lock.sleep('||TO_CHAR(&ostackprof_interval)||')' ) cmd FROM (select 1 from dual CONNECT BY level <= &ostackprof_samples) . SPOOL ostackprof_&ostackprof_spid..tmp SET HEADING OFF PROMPT spool ostackprof_&ostackprof_spid..txt / PROMPT spool off SET HEADING ON SPOOL OFF SET TERMOUT ON PROMPT Sampling... SET TERMOUT OFF @ostackprof_&ostackprof_spid..tmp SET TERMOUT ON FEEDBACK ON
[20250418]绑定变量太多的分析(21c).txt
来源:这里教程网
时间:2026-03-03 21:52:24
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 惊天骗局曝光:“水果第一股”爆雷,多名高管被抓,还有员工打卡等待发工资
惊天骗局曝光:“水果第一股”爆雷,多名高管被抓,还有员工打卡等待发工资
26-03-03 - [20250418]绑定变量太多的限制.txt
[20250418]绑定变量太多的限制.txt
26-03-03 - rac防火墙未禁用服务器重启导致二节点启动异常
rac防火墙未禁用服务器重启导致二节点启动异常
26-03-03 - 数据库管理-第317期 Oracle 12.2打补丁又出问题了(20250421)
- 大学生就业新方向:山姆代购,月入过万
大学生就业新方向:山姆代购,月入过万
26-03-03 - 业务高峰期ddl带崩数据库
业务高峰期ddl带崩数据库
26-03-03 - 利润暴跌30%,高管年薪狂涨84倍:谁在掏空贝壳找房?
利润暴跌30%,高管年薪狂涨84倍:谁在掏空贝壳找房?
26-03-03 - schedule job 新增删除操作简单研究
schedule job 新增删除操作简单研究
26-03-03 - Oracle 11g RAC ASM磁盘组剔盘、加盘实施过程
Oracle 11g RAC ASM磁盘组剔盘、加盘实施过程
26-03-03 - Oracle 11g RAC手动打补丁详细步骤
Oracle 11g RAC手动打补丁详细步骤
26-03-03
