邪恶八进制信息安全团队技术讨论组's Archiver

pub!1c 2006-2-12 11:09

[转载]Oracle诊断案例-Sql_trace之一

<P>信息来源:邪恶八进制信息安全团队</P>
<P><FONT face="verdana, arial, helvetica" size=2><SPAN class=java script id=text1437728 style="FONT-SIZE: 12px">问题描述:<BR><BR>这是帮助一个公司的诊断案例.<BR>应用是一个后台新闻发布系统.<BR><BR>症状是,通过连接访问新闻页是极其缓慢<BR>通常需要十数秒才能返回.<BR><BR>这种性能是用户不能忍受的.<BR><BR>操作系统:SunOS 5.8<BR>数据库版本:8.1.7</SPAN></FONT></P>

pub!1c 2006-2-12 11:10

<P><FONT face="verdana, arial, helvetica" size=2><SPAN class=java script id=text1437729 style="FONT-SIZE: 12px"><STRONG>1.检查并跟踪数据库进程</STRONG><BR><BR>诊断时是晚上,无用户访问<BR>在前台点击相关页面,同时进行进程跟踪<BR><BR>查询v$session视图,获取进程信息<BR></FONT>
<BLOCKQUOTE><PRE><FONT size=2><FONT face=verdana,arial,helvetica>代码:</FONT><HR></FONT><CODE><FONT color=#000000>
<FONT color=#0000bb><BR>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>select sid</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>serial</FONT><FONT color=#ff8000>#,username from v$session;
<BR>
<BR></FONT><FONT color=#0000bb>SIDSERIAL</FONT><FONT color=#ff8000># USERNAME
<BR></FONT><FONT color=#007700>---------- ---------- ------------------------------
<BR></FONT><FONT color=#0000bb>11
<BR>21
<BR>31
<BR>41
<BR>51
<BR>61
<BR>7284 IFLOW
<BR>11214 IFLOW
<BR>12164 SYS
<BR>161042 IFLOW
<BR>
<BR>10 rows selected</FONT><FONT color=#007700>.<BR></FONT></FONT></CODE><HR></PRE></BLOCKQUOTE><FONT face="verdana, arial, helvetica"><BR><FONT size=2>启用相关进程sql_trace<BR><BR></FONT></FONT>
<BLOCKQUOTE><PRE><FONT size=2><FONT face=verdana,arial,helvetica>代码:</FONT><HR></FONT><CODE><FONT color=#000000>
<FONT color=#0000bb><BR>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>exec dbms_system</FONT><FONT color=#007700>.</FONT><FONT color=#0000bb>set_sql_trace_in_session</FONT><FONT color=#007700>(</FONT><FONT color=#0000bb>7</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>284</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>true</FONT><FONT color=#007700>)
<BR>
<BR></FONT><FONT color=#0000bb>PL</FONT><FONT color=#007700>/</FONT><FONT color=#0000bb>SQL procedure successfully completed</FONT><FONT color=#007700>.
<BR>
<BR></FONT><FONT color=#0000bb>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>exec dbms_system</FONT><FONT color=#007700>.</FONT><FONT color=#0000bb>set_sql_trace_in_session</FONT><FONT color=#007700>(</FONT><FONT color=#0000bb>11</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>214</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>true</FONT><FONT color=#007700>)
<BR>
<BR></FONT><FONT color=#0000bb>PL</FONT><FONT color=#007700>/</FONT><FONT color=#0000bb>SQL procedure successfully completed</FONT><FONT color=#007700>.
<BR>
<BR></FONT><FONT color=#0000bb>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>exec dbms_system</FONT><FONT color=#007700>.</FONT><FONT color=#0000bb>set_sql_trace_in_session</FONT><FONT color=#007700>(</FONT><FONT color=#0000bb>16</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>1042</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>true</FONT><FONT color=#007700>)
<BR>
<BR></FONT><FONT color=#0000bb>PL</FONT><FONT color=#007700>/</FONT><FONT color=#0000bb>SQL procedure successfully completed</FONT><FONT color=#007700>.
<BR>
<BR></FONT><FONT color=#0000bb>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>select sid</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>serial</FONT><FONT color=#ff8000>#,username from v$session;
<BR>
<BR></FONT><FONT color=#0000bb>SIDSERIAL</FONT><FONT color=#ff8000># USERNAME
<BR></FONT><FONT color=#007700>---------- ---------- ------------------------------
<BR></FONT><FONT color=#0000bb>11
<BR>21
<BR>31
<BR>41
<BR>51
<BR>61
<BR>7284 IFLOW
<BR>11214 IFLOW
<BR>12164 SYS
<BR>161042 IFLOW
<BR>
<BR>10 rows selected</FONT><FONT color=#007700>.<BR></FONT></FONT></CODE><HR></PRE></BLOCKQUOTE><FONT face="verdana, arial, helvetica"><BR><FONT size=2>等候一段时间,关闭sql_trace<BR><BR></FONT></FONT>
<BLOCKQUOTE><PRE><FONT size=2><FONT face=verdana,arial,helvetica>代码:</FONT><HR></FONT><CODE><FONT color=#000000>
<FONT color=#0000bb><BR>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>exec dbms_system</FONT><FONT color=#007700>.</FONT><FONT color=#0000bb>set_sql_trace_in_session</FONT><FONT color=#007700>(</FONT><FONT color=#0000bb>7</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>284</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>false</FONT><FONT color=#007700>)
<BR>
<BR></FONT><FONT color=#0000bb>PL</FONT><FONT color=#007700>/</FONT><FONT color=#0000bb>SQL procedure successfully completed</FONT><FONT color=#007700>.
<BR>
<BR></FONT><FONT color=#0000bb>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>exec dbms_system</FONT><FONT color=#007700>.</FONT><FONT color=#0000bb>set_sql_trace_in_session</FONT><FONT color=#007700>(</FONT><FONT color=#0000bb>11</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>214</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>false</FONT><FONT color=#007700>)
<BR>
<BR></FONT><FONT color=#0000bb>PL</FONT><FONT color=#007700>/</FONT><FONT color=#0000bb>SQL procedure successfully completed</FONT><FONT color=#007700>.
<BR>
<BR>
<BR></FONT><FONT color=#0000bb>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>exec dbms_system</FONT><FONT color=#007700>.</FONT><FONT color=#0000bb>set_sql_trace_in_session</FONT><FONT color=#007700>(</FONT><FONT color=#0000bb>16</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>1042</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>false</FONT><FONT color=#007700>)
<BR>
<BR></FONT><FONT color=#0000bb>PL</FONT><FONT color=#007700>/</FONT><FONT color=#0000bb>SQL procedure successfully completed</FONT><FONT color=#007700>.<BR></FONT></FONT></CODE><HR></PRE></BLOCKQUOTE></SPAN>

pub!1c 2006-2-12 11:10

<P><FONT face="verdana, arial, helvetica" size=2><SPAN class=java script id=text1437732 style="FONT-SIZE: 12px"><STRONG>2.检查trace文件</STRONG><BR><BR>检查发现以下语句是可疑的<BR><BR></FONT>
<BLOCKQUOTE><PRE><FONT size=2><FONT face=verdana,arial,helvetica>代码:</FONT><HR></FONT><CODE><FONT color=#000000>
<FONT color=#0000bb><BR></FONT><FONT color=#007700>********************************************************************************
<BR>
<BR></FONT><FONT color=#0000bb>select auditstatus</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>categoryid</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>auditlevel
<BR>from
<BR> categoryarticleassign a</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>category b where b</FONT><FONT color=#007700>.</FONT><FONT color=#0000bb>id</FONT><FONT color=#007700>=</FONT><FONT color=#0000bb>a</FONT><FONT color=#007700>.</FONT><FONT color=#0000bb>categoryid </FONT><FONT color=#007700>and </FONT><FONT color=#0000bb>articleId</FONT><FONT color=#007700>=
<BR></FONT><FONT color=#0000bb>20030700400141 </FONT><FONT color=#007700>and </FONT><FONT color=#0000bb>auditstatus</FONT><FONT color=#007700>></FONT><FONT color=#0000bb>0
<BR>
<BR>
<BR>callcountcpuelapseddiskquerycurrentrows
<BR></FONT><FONT color=#007700>------- -------------- ---------- ---------- ---------- --------------------
<BR></FONT><FONT color=#0000bb>Parse10.000.000000
<BR>Execute10.000.000000
<BR>Fetch10.810.810389201
<BR></FONT><FONT color=#007700>------- -------------- ---------- ---------- ---------- --------------------
<BR></FONT><FONT color=#0000bb>total30.810.810</FONT><FONT color=#dd0000>'3892'</FONT><FONT color=#0000bb>0&nb</FONT></CODE><HR></PRE></BLOCKQUOTE><FONT face="verdana, arial, helvetica"><BR><FONT size=2>这里显然是根据articleId进行新闻读取的.<BR>很可疑的是query读取有3892<BR><BR>这个内容引起了我的注意.<BR>如果遇到过类似的问题,大家在这里就应该知道是怎么回事情了.<BR>如果没有遇到过的朋友,可以在这里思考一下再往下看.<BR><BR></FONT></FONT>
<BLOCKQUOTE><PRE><FONT size=2><FONT face=verdana,arial,helvetica>代码:</FONT><HR></FONT><CODE><FONT color=#000000>
<FONT color=#0000bb><BR>Misses in library cache during parse</FONT><FONT color=#007700>: </FONT><FONT color=#0000bb>1
<BR>Optimizer goal</FONT><FONT color=#007700>: </FONT><FONT color=#0000bb>CHOOSE
<BR>Parsing user id</FONT><FONT color=#007700>: </FONT><FONT color=#0000bb>41
<BR>
<BR>RowsRow Source Operation
<BR></FONT><FONT color=#007700>----------------------------------------------------------
<BR></FONT><FONT color=#0000bb>1NESTED LOOPS
<BR>2INDEX RANGE SCAN </FONT><FONT color=#007700>(</FONT><FONT color=#0000bb>object id 25062</FONT><FONT color=#007700>)
<BR></FONT><FONT color=#0000bb>1TABLE ACCESS BY INDEX ROWID CATEGORY
<BR>2INDEX UNIQUE SCAN </FONT><FONT color=#007700>(</FONT><FONT color=#0000bb>object id 25057</FONT><FONT color=#007700>)
<BR>
<BR>********************************************************************************
<BR>
<BR></FONT><FONT color=#0000bb>select auditstatus</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>categoryid
<BR>from
<BR> categoryarticleassign where articleId</FONT><FONT color=#007700>=</FONT><FONT color=#0000bb>20030700400138 </FONT><FONT color=#007700>and </FONT><FONT color=#0000bb>categoryId in </FONT><FONT color=#007700>(</FONT><FONT color=#dd0000>'63'</FONT><FONT color=#007700>,
<BR></FONT><FONT color=#dd0000>'138'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'139'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'140'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'141'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'142'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'143'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'144'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'168'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'213'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'292'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'341'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'346'</FONT><FONT color=#007700>,
<BR></FONT><FONT color=#dd0000>'347'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'348'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'349'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'350'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'351'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'352'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'353'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'354'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'355'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'356'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'357'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'358'</FONT><FONT color=#007700>,
<BR></FONT><FONT color=#dd0000>'359'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'360'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'361'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'362'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'363'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'364'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'365'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'366'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'367'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'368'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'369'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'370'</FONT><FONT color=#007700>,
<BR></FONT><FONT color=#dd0000>'371'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'372'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'383'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'460'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'461'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'462'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'463'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'621'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'622'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'626'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'629'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'631'</FONT><FONT color=#007700>,
<BR></FONT><FONT color=#dd0000>'634'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'636'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'643'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'802'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'837'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'838'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'849'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'850'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'851'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'852'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'853'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'854'</FONT><FONT color=#007700>,
<BR></FONT><FONT color=#dd0000>'858'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'859'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'860'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'861'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'862'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'863'</FONT><FONT color=#007700>,</FONT><FONT color=#dd0000>'-1'</FONT><FONT color=#007700>)
<BR>
<BR>
<BR></FONT><FONT color=#0000bb>callcountcpuelapseddiskquerycurrentrows
<BR></FONT><FONT color=#007700>------- -------------- ---------- ---------- ---------- --------------------
<BR></FONT><FONT color=#0000bb>Parse10.000.000000
<BR>Execute10.000.000000
<BR>Fetch14.914.910283571
<BR></FONT><FONT color=#007700>------- -------------- ---------- ---------- ---------- --------------------
<BR></FONT><FONT color=#0000bb>total34.914.910283571
<BR>
<BR>Misses in library cache during parse</FONT><FONT color=#007700>: </FONT><FONT color=#0000bb>1
<BR>Optimizer goal</FONT><FONT color=#007700>: </FONT><FONT color=#0000bb>CHOOSE
<BR>Parsing user id</FONT><FONT color=#007700>: </FONT><FONT color=#0000bb>41
<BR>
<BR>RowsRow Source Operation
<BR></FONT><FONT color=#007700>----------------------------------------------------------
<BR></FONT><FONT color=#0000bb>1 </FONT><FONT color=#dd0000>'TABLE ACCESS FULL CATEGORYARTICLEASSIGN'
<BR>
<BR></FONT><FONT color=#0000bb>我们注意到,这里有一个全表扫描存在
<BR>
<BR>
<BR></FONT><FONT color=#007700>********************************************************************************<BR></FONT></FONT></CODE><HR></PRE></BLOCKQUOTE></FONT></SPAN>

pub!1c 2006-2-12 11:10

<P><FONT face="verdana, arial, helvetica" size=2><SPAN class=java script id=text1437733 style="FONT-SIZE: 12px"><STRONG>3.登陆数据库,检查相应表结构<BR></STRONG><BR></FONT>
<BLOCKQUOTE><PRE><FONT size=2><FONT face=verdana,arial,helvetica>代码:</FONT><HR></FONT><CODE><FONT color=#000000>
<FONT color=#0000bb><BR>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>select index_name</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>table_name</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>column_name from user_ind_columns
<BR>2where table_name</FONT><FONT color=#007700>=</FONT><FONT color=#0000bb>upper</FONT><FONT color=#007700>(</FONT><FONT color=#dd0000>'categoryarticleassign'</FONT><FONT color=#007700>);
<BR>
<BR></FONT><FONT color=#0000bb>INDEX_NAMETABLE_NAMECOLUMN_NAME
<BR></FONT><FONT color=#007700>------------------------------ ------------------------------ --------------------
<BR></FONT><FONT color=#dd0000>'IDX_ARTICLEIDCATEGORYARTICLEASSIGNARTICLEID'
<BR></FONT><FONT color=#0000bb>IND_ARTICLEID_CATEGCATEGORYARTICLEASSIGNARTICLEID
<BR>IND_ARTICLEID_CATEGCATEGORYARTICLEASSIGNCATEGORYID
<BR>IDX_SORTIDCATEGORYARTICLEASSIGNSORTID
<BR>PK_CATEGORYARTICLEASSIGNCATEGORYARTICLEASSIGNARTICLEID
<BR>PK_CATEGORYARTICLEASSIGNCATEGORYARTICLEASSIGNCATEGORYID
<BR>PK_CATEGORYARTICLEASSIGNCATEGORYARTICLEASSIGNASSIGNTYPE
<BR>IDX_CAT_ARTICLECATEGORYARTICLEASSIGNAUDITSTATUS
<BR>IDX_CAT_ARTICLECATEGORYARTICLEASSIGNARTICLEID
<BR>IDX_CAT_ARTICLECATEGORYARTICLEASSIGNCATEGORYID
<BR>IDX_CAT_ARTICLECATEGORYARTICLEASSIGNASSIGNTYPE
<BR>
<BR>11 rows selected</FONT><FONT color=#007700>.<BR></FONT></FONT></CODE><HR></PRE></BLOCKQUOTE><FONT face="verdana, arial, helvetica"><BR><BR><FONT size=2>我们注意到,IDX_ARTICLEID索引在以上查询中都没有被用到.<BR><BR>检查表结构:<BR><BR></FONT></FONT>
<BLOCKQUOTE><PRE><FONT size=2><FONT face=verdana,arial,helvetica>代码:</FONT><HR></FONT><CODE><FONT color=#000000>
<FONT color=#0000bb><BR>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>desc categoryarticleassign
<BR> NameNull</FONT><FONT color=#007700>?</FONT><FONT color=#0000bb>Type
<BR> </FONT><FONT color=#007700>----------------------------------------- -------- ----------------------------
<BR> </FONT><FONT color=#0000bb>CATEGORYIDNOT NULL NUMBER
<BR></FONT><FONT color=#dd0000>'ARTICLEIDNOT NULL VARCHAR2(14)'
<BR> </FONT><FONT color=#0000bb>ASSIGNTYPENOT NULL VARCHAR2</FONT><FONT color=#007700>(</FONT><FONT color=#0000bb>1</FONT><FONT color=#007700>)
<BR> </FONT><FONT color=#0000bb>AUDITSTATUSNOT NULL NUMBER
<BR> SORTIDNOT NULL NUMBER
<BR> UNPASSVARCHAR2</FONT><FONT color=#007700>(</FONT><FONT color=#0000bb>255</FONT><FONT color=#007700>)<BR></FONT></FONT></CODE><HR></PRE></BLOCKQUOTE><FONT face="verdana, arial, helvetica"><BR><FONT size=2>问题发现:<BR>因为ARTICLEID是个字符型数据,查询中给入的articleId= 20030700400141 是一个数字值<BR>Oracle发生潜在的数据类型转换,从而导致了索引失效<BR><BR></FONT></FONT>
<BLOCKQUOTE><PRE><FONT size=2><FONT face=verdana,arial,helvetica>代码:</FONT><HR></FONT><CODE><FONT color=#000000>
<FONT color=#0000bb><BR>SQL</FONT><FONT color=#007700>></FONT><FONT color=#0000bb>select auditstatus</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>categoryid
<BR>2from
<BR>3categoryarticleassign where articleId</FONT><FONT color=#007700>=</FONT><FONT color=#0000bb>20030700400132</FONT><FONT color=#007700>;
<BR>
<BR></FONT><FONT color=#0000bb>AUDITSTATUS CATEGORYID
<BR></FONT><FONT color=#007700>----------- ----------
<BR></FONT><FONT color=#0000bb>994
<BR>0383
<BR>0695
<BR>
<BR>Elapsed</FONT><FONT color=#007700>: </FONT><FONT color=#0000bb>00</FONT><FONT color=#007700>:</FONT><FONT color=#0000bb>00</FONT><FONT color=#007700>:</FONT><FONT color=#0000bb>02.62
<BR>
<BR>Execution Plan
<BR></FONT><FONT color=#007700>----------------------------------------------------------
<BR></FONT><FONT color=#0000bb>0SELECT STATEMENT Optimizer</FONT><FONT color=#007700>=</FONT><FONT color=#0000bb>CHOOSE </FONT><FONT color=#007700>(</FONT><FONT color=#0000bb>Cost</FONT><FONT color=#007700>=</FONT><FONT color=#0000bb>110 Card</FONT><FONT color=#007700>=</FONT><FONT color=#0000bb>2 Bytes</FONT><FONT color=#007700>=</FONT><FONT color=#0000bb>38</FONT><FONT color=#007700>)
<BR></FONT><FONT color=#0000bb>10TABLE ACCESS </FONT><FONT color=#007700>(</FONT><FONT color=#0000bb>FULL</FONT><FONT color=#007700>) </FONT><FONT color=#0000bb>OF </FONT><FONT color=#dd0000>'CATEGORYARTICLEASSIGN' </FONT><FONT color=#007700>(</FONT><FONT color=#0000bb>Cost</FONT><FONT color=#007700>=</FONT><FONT color=#0000bb>110 Card</FONT><FONT color=#007700>=</FONT><FONT color=#0000bb>2 Bytes</FONT><FONT color=#007700>=</FONT><FONT color=#0000bb>38</FONT><FONT color=#007700>)<BR></FONT></FONT></CODE><HR></PRE></BLOCKQUOTE></SPAN>
<P></P>

pub!1c 2006-2-12 11:10

<P><FONT face="verdana, arial, helvetica" size=2><SPAN class=java script id=text1437734 style="FONT-SIZE: 12px"><STRONG>4.解决方法<BR></STRONG><BR>简单的在参数两侧各增加一个',既可解决这个问题.<BR><BR>对于类似的查询,我们发现Query模式读取降低为2<BR>几乎不需要花费CPU时间了<BR><BR></FONT>
<BLOCKQUOTE><PRE><FONT size=2><FONT face=verdana,arial,helvetica>代码:</FONT><HR></FONT><CODE><FONT color=#000000>
<FONT color=#0000bb><BR></FONT><FONT color=#007700>********************************************************************************
<BR>
<BR></FONT><FONT color=#0000bb>select unpass
<BR>from
<BR> categoryarticleassign where articleid</FONT><FONT color=#007700>=</FONT><FONT color=#dd0000>'20030320000682' </FONT><FONT color=#007700>and </FONT><FONT color=#0000bb>categoryid</FONT><FONT color=#007700>=</FONT><FONT color=#dd0000>'113'
<BR>
<BR></FONT><FONT color=#0000bb>callcountcpuelapseddiskquerycurrentrows
<BR></FONT><FONT color=#007700>------- -------------- ---------- ---------- ---------- --------------------
<BR></FONT><FONT color=#0000bb>Parse10.000.000000
<BR>Execute10.000.000000
<BR>Fetch10.000.000200
<BR></FONT><FONT color=#007700>------- -------------- ---------- ---------- ---------- --------------------
<BR></FONT><FONT color=#0000bb>total30.000.000200
<BR>
<BR>Misses in library cache during parse</FONT><FONT color=#007700>: </FONT><FONT color=#0000bb>1
<BR>Optimizer goal</FONT><FONT color=#007700>: </FONT><FONT color=#0000bb>CHOOSE
<BR>Parsing user id</FONT><FONT color=#007700>: </FONT><FONT color=#0000bb>20
<BR>
<BR>RowsRow Source Operation
<BR></FONT><FONT color=#007700>----------------------------------------------------------
<BR></FONT><FONT color=#0000bb>0TABLE ACCESS BY INDEX ROWID CATEGORYARTICLEASSIGN
<BR>1INDEX RANGE SCAN </FONT><FONT color=#007700>(</FONT><FONT color=#0000bb>object id 3080</FONT><FONT color=#007700>)
<BR>
<BR>********************************************************************************<BR></FONT></FONT></CODE><HR></PRE></BLOCKQUOTE><FONT face="verdana, arial, helvetica"><BR><FONT size=2>至此,这个问题得到了完满的解决.</FONT></SPAN></FONT>

pub!1c 2006-2-12 11:12

<P><FONT face="verdana, arial, helvetica" size=2><SPAN class=java script id=text1437735 style="FONT-SIZE: 12px"><STRONG>总结<BR></STRONG><BR>在Oracle开发中,我们应该尽量避免使用隐式的数据类型转换<BR>因为隐式数据类型转换可能会带来索引失效的问题.<BR><BR>这些问题,在开发阶段就应该被避免.<BR><BR>使用函数导致索引失效的问题与此类似.<BR>本例给出了一个诊断问题的方法,供大家商榷参考.<BR><BR>-Eygle</SPAN></FONT></P>

页: [1]
© 1999-2008 EvilOctal Security Team