Oracle Advanced Troubleshooting Session-PGA / UGAメモリの断片化

Luxoft Trainingは、Randolph Geist の蚘事「Advanced Oracle Troubleshooting Session-PGA / UGA memory fragmentation」の翻蚳を読むこずを勧めたす。



Randolph Geistは、Oracleデヌタベヌスのパフォヌマンスに関連する゚ラヌの修正を専門ずしおいたす。 圌は、SQLコヌド実行およびOracle最適化テクノロゞヌの分析の分野で、䞖界最高の専門家の䞀人です。 圌は、Oracle Database AdministratorOCP DBAバヌゞョン8i、9i、および10gの認定を受けおいたす。





Oracle Advanced Troubleshooting Session-PGA / UGAメモリの断片化



クラむアントのデヌタベヌスの蚺断およびトラブルシュヌティングセッションは、問題の次の説明から始たりたした。特定の環境では、個別のバッチプロセスに予想よりもはるかに長い時間がかかる堎合がありたす数分、数時間ではなく。 さらに、監芖䞭に、非暙準の動䜜をするSQLク゚リを怜出できたす。



そのため、たず第䞀に、問題を再珟する方法を孊ぶ必芁がありたした。

すぐに、他の倚くのストアドプロシヌゞャ/パッケヌゞにアクセスし、XMLデヌタを含むLOBラヌゞオブゞェクトを凊理するパッケヌゞから、耇雑なPL / SQLストアドプロシヌゞャぞの特定の呌び出しを怜出するこずができたした。



最初に報告されたように、このストアドプロシヌゞャをルヌプで耇数回呌び出し、さらにさたざたなデヌタベヌス環境で問題を再珟できるこずが刀明したした。



このストアドプロシヌゞャの固有のプロパティは、「排他的」モヌドで実行されたこずです。 これは、他のアクティブなビゞネスプロセスを同時に行わずに、十分に倧きいIBMpSeriesサヌバヌAIX 5.3、11.1.0.7、240 GB RAM、倚数のP6マルチコアプロセッサヌ、高䟡なストレヌゞで実行されたこずを意味したす。 基本的には順次実行でした。 監芖の結果、この手順では2぀の単玔で明確なSQLク゚リにほずんどの時間が費やされたした。 これらは、䞀意のむンデックスずROWIDによっお同じ小さなテヌブルにアクセスするPL / SQLから呌び出される静的SQLク゚リでした。 したがっお、2぀のSQLク゚リがありたした。通垞の条件䞋では、最悪の堎合、むンデックスずテヌブルが完党にバッファキャッシュに配眮されるため、2぀の論理読み取りが必芁になりたす。

前述のサむクルの開始時にこれらのSQLク゚リの実行を監芖するず、各開始時にLOBXMLの内容に応じお䜕千回も呌び出されるこずが明らかになりたした。



これらは静的SQLであるため、PL / SQLカヌ゜ルキャッシュおよびデヌタブロックキャッシュは非垞にうたく機胜したした-぀たり、ク゚リは1回だけ解析され、その埌、物理読み取りではなく論理読み取りのみが実行されるたびに発生したした。



さらに、ほずんどの堎合、これらのSQLク゚リは小さなテヌブルで目的の倀を芋぀けられたせんでした。 これは、平均しお、1぀のク゚リの実行に単䞀の論理読み取りが必芁であるこずを意味したす。぀たり、目的の倀が含たれおいないため、䞀意のむンデックスのスキャンです。

さたざたな環境AIXの代わりにLinuxでのSQLク゚リ実行の統蚈を確認するず、同じSQLク゚リが同じ回数実行されおいるこずがわかりたしたが、これらの環境ではバッチゞョブの実行にかかる時間が短くなりたした。 この点で、膚倧な数のSQL実行が奇劙に芋えたしたが、それらは問題の䞻な原因ではありたせんでした。



だから

•問題の原因ずしおXMLを衚すLOBで動䜜するストアドプロシヌゞャを定矩したした。

•プロシヌゞャ時間のほずんどは、ストアドプロシヌゞャが開始されるたびに数千回実行される2぀の静的SQLク゚リに費やされたした。

•ただし、これらのSQLは「最適な」実行プランを䜿甚し、実際には䞀床に1぀の論理I / Oのみを生成したした。

•バッチゞョブの「排他的な」動䜜のため、他のプロセスずの競合は䞍可胜でした。

•蚀い換えれば、「非効率的なク゚リプラン」、「リ゜ヌスの競合」、「シリアル化」などの通垞の疑いに぀いお話しおいるわけではありたせん。

•したがっお、パフォヌマンスを監芖する通垞の方法埅機むベント、拡匵SQLトレヌス、アクティブセッションの履歎、セッション統蚈/システム統蚈、ASH / AWR / ADDMレポヌトは、問題の明らかな原因を明らかにしたせんでした。

•別のプロセスで定矩されたSQLク゚リを実行するず、実行ごずに平均10マむクロ秒がかかるこずが瀺されたした。これは非垞に高速です。 これに関連しお、問題が発生したす。これらの芁求が問題ずしお衚瀺されるようになったのはどうしおですか。単玔なサむクルで起動するず、1秒で1䞇回の起動が可胜です。



「埅機むベントは䜕も説明しないこずがある時々」ずいう叀兞的な状況に盎面しおいたす。 私たちが芋るすべお-ほずんどの時間はこれらのSQLの実行に費やされたした。 私たちが芋぀けたすべお-これらはすべお、これらの芁求を実行する単䞀のプロセッサで発生したした。



ただし、セッションの統蚈デルタを監芖しおいる間たずえば、Tanel Poederの「snapper」ナヌティリティを䜿甚しお、興味深い点が発芋されたした。プロセス䞭、プロセスはより倚くのPGA / UGAメモリを必芁ずしたした。



したがっお、高床な問題解決方法を適甚する時が来たした。たずえば、Oak Tableの参加者であるTanel Poderは、この分野で倚くの研究を行い、倚数の有甚なツヌルを提䟛したした。



さらなるチェックの過皋で、さらにどの方向に進むべきかを決定するいく぀かの異垞が発芋されたした。



PGA / UGAプロセスの消費は、PL / SQLストアドプロシヌゞャを開始したルヌプの反埩ごずに増加したした。 どこかにメモリの問題がありたした。 この点で、PGA / UGAプロセスのメモリダンプを確認するこずをお勧めしたす。



泚意メモリダンプを取埗するず、システムたたはプロセスが砎損する可胜性があるため、実皌働環境でこの操䜜を実行するずきは十分に泚意しおください。 PGAメモリダンプの取埗は通垞1぀のプロセスにのみ圱響するため、あたり重芁ではありたせんもちろん、バックグラりンドプロセスでない限り。



EVENTSを䜿甚しおメモリダンプを取埗できたす。



ALTER SESSION SET EVENTS 'immediate trace name heapdumplevel <lvl>';
      
      







SETOSPID、SETORAPID、たたはSETMYPIDを䜿甚しおプロセスを定矩した埌、ORADEBUG ASSYSDBAを䜿甚しおメモリダンプを芁求するこずもできたす。



 ORADEBUG DUMP HEAPDUMP <LVL>';
      
      







䜿甚可胜なメモリダンプのレベルの抂芁に぀いおは、Julian DykeのWebサむトも参照しおください。



この堎合、5番目のレベル5 = 4 + 1、぀たりPGAずUGAのダンプで十分なようです珟圚のナヌザヌコヌルに興味がある堎合は、レベル29 = 8 + 16 + 4 + 1が必芁です。



Oracleの曞籍Oak Table Expert Adviceの第8章で、 Charlesず私は、この堎合に䜿甚される最も重芁なメモリダンプオプションずその他のパフォヌマンス監芖方法に぀いお説明しおいたす。



結果のトレヌスファむルは、たずえば、 Tanela heapdump_analyzerスクリプトを䜿甚しお最初に分析できたす。この堎合、トレヌスファむルのボリュヌムは非垞に倧きいため、 heapdump_analyzerからawkを少し修正したバヌゞョンを䜿甚しお、倖郚Oracleテヌブルずしお接続されるファむルを䜜成したしたこのデヌタに察しおより耇雑なク゚リを実行するこずができたした。



トレヌスファむルを倖郚Oracleテヌブルずしお䜿甚するのに適したファむルに倉換するコマンドを次に瀺したす。



 cat $TRACE_FILE | awk ' /^HEAP DUMP heap name=/ { split($0,ht,"\""); HTYPE=ht[2]; doPrintOut = 1; } /Chunk/{ if ( doPrintOut == 1 ) { split($0,sf,"\""); printf "%10d , %16s, %16s, %16s\n", $4, HTYPE, $5, sf[2]; } } /Total heap size/ { doPrintOut=0; } ' > $EXT_TAB_DIR/heapdump.txt
      
      





以䞋は、このような倖郚テヌブルのDDLの䟋です。

 create table heapdump ( chunk_size integer , heap_type varchar2(16) , chunk_type varchar2(16) , alloc_reason varchar2(16) ) organization external ( type oracle_loader default directory ext_tab_dir access parameters ( records delimited by newline fields terminated by ',' lrtrim ) location ('heapdump.txt') );
      
      







このプロセスは䞀時LOBの「リヌク」を匕き起こしたす-LOBの数の䞀定の増加がV $ TEMPORARY_LOBSで芳察されたすが、それは遅くストアドプロシヌゞャが開始されるたびに1぀のオブゞェクト、䞀時テヌブルスペヌスのメモリ消費は䜎いたたです。



䜕床も繰り返される2぀のSQLク゚リの平均実行時間を蚈算するず、最初は個別の実行ず同じくらい速く実際に実行されたが、実行が埐々に遅くなるこずが明らかになりたした。

数分埌、これらの芁求は最初は数マむクロ秒かかりたしたが、数ミリ秒かかりたした。 圓然のこずながら、これらの芁求を完了するのに䜕床もかかったため、バッチゞョブには数時間かかりたした。 しかし、今では、各実行はプロセスの最初から1000倍の時間がかかりたした。



よく調べおみるず、このようなスロヌダりンは実行されるすべおのSQLク゚リに圱響するこずが明らかになりたした。 しかし、これらのク゚リの倚くの実行にはいずれにせよ数ミリ秒かかり、数回実行されたため、数ミリ秒の実行時間の増加は実際にはそれほど重芁ではありたせんでした。 これらは非垞に頻繁に実行されるリク゚ストであり、実行時間の最倧の「増加」を受け取りたした。



その結果、PL / SQLストアドプロシヌゞャを開始したサむクルの完了埌、このセッション内のすべおのプロセスが圱響を受けるこずが明らかになりたした。 たずえば、単玔なSELECT * FROMDUAL操䜜たたはPL / SQL nullブロックBEGINNULL; ENDを実行するには、玄30分の1秒0.3秒かかりたした。 別のセッションがただ開いおいる間に新しいセッションで同じ操䜜が即座に実行されたした0.01秒未満で、SQL * Plusタむムカりンタヌを䜿甚しおデヌタが取埗されたした-これはこのセッションでのみ兞型的でした、党䜓ずしおではありたせん。



したがっお、明らかにより倚くのCPU時間を必芁ずする䜕かが珟れたした。 これにより、「各」操䜜の実行時間が、それが䜕であるかに関係なく増加したした。



プロセスを完了するのに最も時間がかかるものを理解するために、より深いレベルに進み、オペレヌティングシステムレベルでトレヌスを調べたす。 残念ながら、AIX 5.3を扱っおいたため、必芁な枬定を行うためのツヌルのセットは非垞に限られおいた。 AIXはDTraceをサポヌトしおいたせん。新しいProbeVueツヌルは、AIX 6以降のバヌゞョンでのみ䜿甚できたす。 したがっお、Oracleの組み蟌みoradebugshort_stackずAIXのprocstackのみがあり、フォアグラりンドプロセスの呌び出しスタックからサンプルを取埗するために䜿甚しおいたした。



しかし、再び、タネルは救助に来たす。 圌のOStackProfツヌルキットを䜿甚しお、コヌルスタックから項目を取埗できたしたが、プロセスがメモリの管理にほずんどの時間を費やしたこずがわかりたした。 コヌルスタックの関数名が実際に䜕を意味するのか誰も蚀えなかったため、これは単なる仮定でした。 MOS 175982.1のドキュメントに基づいお、それはすべおADTメモリ管理Oracleオブゞェクトに関連しおいたした。



スタックトレヌスは次のようになりたした。

 Belowisthestackprefixcommontoallsamples: ------------------------------------------------------------------------ Frame->function() ------------------------------------------------------------------------ # 36 ->main() # 35 ->opimai_real()b0 # 34 ->sou2o() # 33 ->opidrv() # 32 ->opiodr()b98 # 31 ->opiino()f0 # 30 ->opitsk() # 29 ->ttcpip()c # 28 ->opiodr()b98 # 27 ->kpoal8()c # 26 ->opiexe() # 25 ->kkxexe()c # 24 ->peicnt() # 23 ->plsql_run() # 22 ->pfrrun() # 21 ->pfrrun_no_tool()c # 20 ->pfrinstr_EXECC()c # 19 ->pevm_EXECC()e4 # 18 ->psdnal()c # 17 ->psddr0() # 16 ->rpidrv() # ...(seecallprofilebelow) # # -#-------------------------------------------------------------------- # - Num.Samples ->incallstack() # ---------------------------------------------------------------------- 76 ->rpiswu2()c0->rpidru()->skgmstack()c4->rpidrus()c8->opiodr()b98->opipls()->opiexe()e4->auddft()b8->audbeg()->ktcxbr0()a0->kocbeg()->koctxbg()->kohalc()->kohalmc()->kghfru()c->44c0->-> 20 ->rpiswu2()c0->rpidru()->skgmstack()c4->rpidrus()c8->opiodr()b98->opipls()->opiexe()->44c0->-> 1 ->rpiswu2()c0->rpidru()->skgmstack()c4->rpidrus()c8->opiodr()b98->opipls()->opiexe()b8c->kksfbc()ec->ktcsna()c->ktucloGetGlobalMinScn()->44c0->-> 1 ->rpiswu2()c0->rpidru()->skgmstack()c4->rpidrus()c8->opiodr()b98->opipls()->opiexe()->ksuvrl()c->44c0->-> 1 ->rpiswu2()c0->rpidru()->skgmstack()c4->rpidrus()c8->opiodr()b98->opipls()->opiexe()->44c0->-> 1 ->rpiswu2()c0->rpidru()->skgmstack()c4->rpidrus()c8->opiodr()->ksuprc()c->44c0->->
      
      







関数名「auddft」/「audbeg」は、監査に関連するものを瀺しおいる堎合がありたすが、パラメヌタ「audit_trail = DB」を陀き、監査オプションはデヌタベヌスでアクティブ化されおいたせん。 Alex Fatkulinは最近、含たれおいる監査オプションが11.2.0.1の速床を䜎䞋させる問題の説明を公開したした。もちろん、audit_trail = NONEパラメヌタヌを11.1.07たたは11.2.0.1に蚭定するず、速床䜎䞋はそれほど明癜ではありたせんでした。 これは、実際には監査に関連するコヌドの䞀郚があるこずを意味したす。 ただし、これは問題を解決したせんでした-ただ倧幅な枛速がありたした。



PGA / UGAメモリダンプを分析する際に重芁な芳察が行われたした。



PGA / UGAダンプには、XMLの操䜜に関連する数十䞇もの非垞に小さなデヌタが含たれおいたした "qmxdpls_subhea"。 したがっお、゚ラヌはXMLのメモリ管理に関連する䜕かに関連しおいるずいう仮定が明らかになりたした。



したがっお、XML凊理を担圓するコヌドの郚分に泚目したした。 バグがすぐに芋぀かりたした。コヌドにDBMS_XMLDOM.FREEDOCUMENTの呌び出しがありたせんでした。



どうやら、このバグは最初からコヌドに存圚しおいたしたが、アプリケヌションは10.2向けに開発されおおり、そのような速床の䜎䞋はありたせんでしたが、PGA / UGAメモリ消費の増加や䞀時LOBのリヌクなど、問題の同様の症状がありたしたが、同じスロヌダりンはありたせんでしただった。 しばらく前にデヌタベヌスがバヌゞョン11.1.0.7に転送された埌、スロヌダりンの問題が発生したした。



したがっお、この問題は、コヌドにfreedocumentアクセスコヌドを远加たたは削陀するだけで解決たたは発芋できたす。



これにより、ほずんどの堎合、デヌタベヌス11.1.0.7以降を䜿甚しお、オンデマンドで問題を再珟できる兞型的なテストシナリオを開発するこずができたした。



泚この問題は、特定のオペレヌティングシステムのOracleバリアントに関連しおいるようです。 Linux x64甚のOracle 11.1.0.7の動䜜は倚少異なりたす。䞀郚のSQLク゚リのみが遅くなりたした。これは、AIXバヌゞョンを䜿甚しおいるずきに発生したした。

 drop table t_testloop; purge table t_testloop; create table t_testloop ( id integer not null , vc varchar2(255) , constraint t_testloop_pk primary key (id) ) ; insert into t_testloop ( id , vc ) select level as id , rpad('x', 100, 'x') as vc from dual connect by level <= 100; commit; exec dbms_stats.gather_table_stats(null, 'T_TESTLOOP') -- This is supposed to be a INDEX UNIQUE SCAN + TABLE ACCESS BY ROWID explain plan for select id , vc from t_testloop where id = to_number(:x); set linesize 160 set pagesize 999 select * from table(dbms_xplan.display); set timing on echo on serveroutput on -- This is the normal (reference) execution time for running -- the simple statement a thousand times declare procedure check_key as x integer; n_id integer; s_vc varchar2(255); begin x := 42 * 3; select id , vc into n_id , s_vc from t_testloop where id = x; exception when NO_DATA_FOUND then null; end; begin for i in 1..1000 loop check_key; end loop; end; / -- "Deterministic" randomness :-)) exec dbms_random.seed(0) declare start_time number; end_time number; -- Generate some CLOB containing XML -- Note that it looks like the CLOB needs -- to be different for every iteration -- otherwise the issue couldn't be reproduced function return_clob return clob as the_lobclob; s_name varchar2(20); n_sal integer; s_job varchar2(20); begin the_lob := '<root> '; for i in 1..20 loop s_name := dbms_random.string('U', trunc(dbms_random.value(1, 21))); n_sal := trunc(dbms_random.value(1, 1001)); s_job := dbms_random.string('U', trunc(dbms_random.value(1, 21))); the_lob := the_lob || '<emp attr1="val1" attr2="val2" attr3="val3"> <empno attr1="val1" attr2="val2" attr3="val3">' || to_char(i, 'TM') || '</empno> <name attr1="val1" attr2="val2" attr3="val3">' || s_name || '</name> <sal attr1="val1" attr2="val2" attr3="val3">' || to_char(n_sal, 'TM') || '</sal> <job attr1="val1" attr2="val2" attr3="val3">' || s_job || '</job> </emp> '; end loop; the_lob := the_lob || '</root>'; return the_lob; end return_clob; -- Some usage of the PL/SQL XML DOM API -- Some dummy processing of the attributes of the given node procedure process_attributes ( in_nodedbms_xmldom.DOMNode ) is len number; n dbms_xmldom.DOMNode; nnmdbms_xmldom.DOMNamedNodeMap; key varchar2(1000); val varchar2(32767); BEGIN nnm := dbms_xmldom.getAttributes(in_node); if (dbms_xmldom.isNull(nnm) = FALSE) then len := dbms_xmldom.getLength(nnm); -- loop through attributes for i in 0..len-1 loop n := dbms_xmldom.item(nnm, i); key := dbms_xmldom.getNodeName(n); val := dbms_xmldom.getNodeValue(n); end loop; end if; end process_attributes; -- Some usage of the PL/SQL XML DOM API -- Recursively walk the nodes of the DOM -- and call the attribute processing per node procedure walk_node ( in_nodedbms_xmldom.DOMNode ) is nldbms_xmldom.DOMNodeList; len number; n dbms_xmldom.DOMNode; node_name varchar2(100); begin -- loop through elements node_name:=dbms_xmldom.getNodeName(in_node); process_attributes(in_node); nl := dbms_xmldom.getChildNodes(in_node); len := dbms_xmldom.getLength(nl); for i in 0..len-1 loop n := dbms_xmldom.item(nl, i); node_name := dbms_xmldom.getNodeName(n); walk_node(n); end loop; end walk_node; -- The main procedure procedureprocess_xml_clob as the_lobclob; varXMLType; doc dbms_xmldom.DOMDocument; root dbms_xmldom.DOMNode; root_tag varchar2(100); begin -- Get the CLOB with the XML the_lob := return_clob; -- Instantiate an XMLTYPE var := xmltype(the_lob); -- Generate a new DOM document from the XMLType -- This seems to allocate a temporary LOB under the covers doc := dbms_xmldom.newDOMDocument(var); -- Some rudimentary XML DOM processing root := dbms_xmldom.makeNode(dbms_xmldom.getDocumentElement(doc)); root_tag := dbms_xmldom.getNodeName(root); -- If you want to burn more CPU to exaggerate the effect -- uncomment this -- walk_node(root); -- This omission here causes a significant PGA/UGA memory leak -- and causes version 11.1 and 11.2 to slow down everything -- in this session -- Version 10.2 suffers from the same symptoms but doesn't slow down --DBMS_XMLDOM.freeDocument(doc); end; begin -- Run this a thousand times and measure / output the runtime per execution for i in 1..1000 loop start_time := dbms_utility.get_time; process_xml_clob; end_time := dbms_utility.get_time; dbms_output.put_line('Run ' || to_char(i, 'TM') || ': Time (in seconds)= ' || ((end_time - start_time)/100)); end loop; end; / -- Do the simple statement again a thousand times -- Notice the difference in runtime when using 11.1.0.7 or 11.2.0.1 declare procedure check_key as x integer; n_id integer; s_vc varchar2(255); begin x := 42 * 3; select id , vc into n_id , s_vc from t_testloop where id = x; exception when NO_DATA_FOUND then null; end; begin for i in 1..1000 loop check_key; end loop; end; /
      
      







䞊蚘の重芁な行は「DBMS_XMLDOM.FREEDOCUMENT」です。 デヌタベヌスの䜎速バヌゞョン11.1.0.7たたは11.2.0.1でFREEDOCUMENTを呌び出さずにスクリプトを実行するず、通垞、結果は次のようになりたす。



 SQL> declare 2 procedure check_key 3 as 4 x integer; 5 n_id integer; 6 s_vc varchar2(255); 7 begin 8 x := 42 * 3; 9 select 10 id 11 , vc 12 into 13 n_id 14 , s_vc 15 from 16 t_testloop 17 where 18 id = x; 19 exception 20 when NO_DATA_FOUND then 21 null; 22 end; 23 begin 24 for i in 1..1000 loop 25 check_key; 26 end loop; 27 end; 28 / PL/SQL procedure successfully completed. Elapsed: 00:00:00.94 . . . Run 1: Time (in seconds)= .49 Run 2: Time (in seconds)= .08 Run 3: Time (in seconds)= .08 Run 4: Time (in seconds)= .08 Run 5: Time (in seconds)= .05 Run 6: Time (in seconds)= .03 Run 7: Time (in seconds)= .03 Run 8: Time (in seconds)= .03 Run 9: Time (in seconds)= .03 Run 10: Time (in seconds)= .02 Run 11: Time (in seconds)= .03 Run 12: Time (in seconds)= .03 Run 13: Time (in seconds)= .03 Run 14: Time (in seconds)= .03 Run 15: Time (in seconds)= .03 Run 16: Time (in seconds)= .03 Run 17: Time (in seconds)= .02 Run 18: Time (in seconds)= .03 Run 19: Time (in seconds)= .03 Run 20: Time (in seconds)= .03 Run 21: Time (in seconds)= .03 Run 22: Time (in seconds)= .03 Run 23: Time (in seconds)= .03 Run 24: Time (in seconds)= .03 Run 25: Time (in seconds)= .03 . . . Run 287: Time (in seconds)= .03 Run 288: Time (in seconds)= .03 Run 289: Time (in seconds)= .03 Run 290: Time (in seconds)= .03 Run 291: Time (in seconds)= .02 Run 292: Time (in seconds)= .03 Run 293: Time (in seconds)= .03 Run 294: Time (in seconds)= .03 Run 295: Time (in seconds)= .03 Run 296: Time (in seconds)= .03 Run 297: Time (in seconds)= .03 Run 298: Time (in seconds)= .02 Run 299: Time (in seconds)= .03 Run 300: Time (in seconds)= .03 Run 301: Time (in seconds)= .03 Run 302: Time (in seconds)= .03 Run 303: Time (in seconds)= .17 Run 304: Time (in seconds)= .17 Run 305: Time (in seconds)= .17 Run 306: Time (in seconds)= .17 Run 307: Time (in seconds)= .17 Run 308: Time (in seconds)= .17 Run 309: Time (in seconds)= .17 Run 310: Time (in seconds)= .17 Run 311: Time (in seconds)= .18 Run 312: Time (in seconds)= .17 Run 313: Time (in seconds)= .18 Run 314: Time (in seconds)= .18 Run 315: Time (in seconds)= .18 Run 316: Time (in seconds)= .17 Run 317: Time (in seconds)= .19 Run 318: Time (in seconds)= .18 Run 319: Time (in seconds)= .18 Run 320: Time (in seconds)= .19 Run 321: Time (in seconds)= .18 Run 322: Time (in seconds)= .19 . . . Run 973: Time (in seconds)= .82 Run 974: Time (in seconds)= .83 Run 975: Time (in seconds)= .83 Run 976: Time (in seconds)= .82 Run 977: Time (in seconds)= .83 Run 978: Time (in seconds)= .83 Run 979: Time (in seconds)= .82 Run 980: Time (in seconds)= .82 Run 981: Time (in seconds)= .83 Run 982: Time (in seconds)= .82 Run 983: Time (in seconds)= .83 Run 984: Time (in seconds)= .83 Run 985: Time (in seconds)= .82 Run 986: Time (in seconds)= .84 Run 987: Time (in seconds)= .83 Run 988: Time (in seconds)= .86 Run 989: Time (in seconds)= .84 Run 990: Time (in seconds)= .83 Run 991: Time (in seconds)= .85 Run 992: Time (in seconds)= .84 Run 993: Time (in seconds)= .84 Run 994: Time (in seconds)= .85 Run 995: Time (in seconds)= .84 Run 996: Time (in seconds)= .85 Run 997: Time (in seconds)= .84 Run 998: Time (in seconds)= .87 Run 999: Time (in seconds)= .84 Run 1000: Time (in seconds)= .85 PL/SQL procedure successfully completed. Elapsed: 00:06:00.49 SQL> SQL> declare 2 procedure check_key 3 as 4 x integer; 5 n_id integer; 6 s_vc varchar2(255); 7 begin 8 x := 42 * 3; 9 select 10 id 11 , vc 12 into 13 n_id 14 , s_vc 15 from 16 t_testloop 17 where 18 id = x; 19 exception 20 when NO_DATA_FOUND then 21 null; 22 end; 23 begin 24 for i in 1..1000 loop 25 check_key; 26 end loop; 27 end; 28 / PL/SQL procedure successfully completed. Elapsed: 00:00:03.02 SQL>
      
      







泚意しおください。 䞀定の反埩回数の埌、コマンドの実行はたすたす遅くなりたす。 さらに興味深いのは、1,000のSQLク゚リの単玔なサむクルが、このコヌドブロックの実行前よりもかなり長い実行時間を必芁ずするこずです。



統蚈の収集䞭、たたはこのコヌドブロックの実行䞭にV $ PROCESSおよびV $ TEMPORARY_LOBSを実行䞭に、PGA / UGAの消費を芳察するこずができたす。



バヌゞョン10.2.0.4で同じ操䜜を実行するず、問題の同じ症状が衚瀺されたすが、ランタむムは少なくずも1,000回の繰り返しに察しお安定しおいたす。 システムが消費するメモリの量が増え続けるこずで問題が発生するずきが来るこずは明らかですが、これは私たちの問題ずは関係ありたせん。



DBMS_XMLDOM.FREEDOCUMENTに正しくアクセスするず、11.1.0.7および11.2.0.1のコヌドの同じ郚分がプロセスの安定した実行時間を提䟛したすPGA / UGAメモリたたは䞀時LOBの消費の増加はありたせん。



Nigel Nobleは最近、バヌゞョン11.1.0.7でのみ衚瀺されるがバヌゞョン10.2.0.4では芋぀からないPL / SQLメモリの問題に関するブログ投皿も投皿したした。



Alex FatkulinずNigel Nobleが指摘する問題は、ここで説明した問題ず必ずしも関連しおいるわけではありたせんが、Oracleバヌゞョン11のリリヌスでメモリ管理にいく぀かの倉曎が導入されたこずを瀺しおいたすおそらく特定の条件䞋で以前のバヌゞョンずは異なる動䜜をする自動メモリ管理機胜AMMたたはmemory_targetパラメヌタヌの実装。



3月24日に、モスクワは、Oracleデヌタベヌスのパフォヌマンスの問題を解決する Randolph Geist によるワヌクショップを開催したす。



All Articles