MSSQL网页编程之懂得raw trace文件的各项内容
在Windows中MySQL以服务形式存在,在使用前应确保此服务已经启动,未启动可用netstartmysql命令启动。而Linux中启动时可用“/etc/rc.d/init.d/mysqldstart"命令,注意启动者应具有管理员权限。明天扫瞄metalink,看到这篇InterpretingRawSQL_TRACE,对照老的一篇文章了,可是的确很有效,以是决意大抵翻译一下吧。
我们晓得有几种办法能够失掉一个SQL语句实行时背景的trace文件,一个是用SQL_TRACE,一个是用DBMS_SUPPORT包大概DBMS_SYSTEM包,另有一种就是间接利用10046event。
利用10046event的办法大抵以下:
altersessionsetevents10046tracenamecontextforever,level12;<BR>
yoursqlstatement...
altersessionsetevents10046tracenamecontextoff;
个中的level有1,4,8,12几个选项,个中1相称于设置SQL_TRACE=TRUE以后的了局,4包含1的了局和绑定变量的实践值,8包含1的了局和守候事务的情形,12则同时包括1的了局,绑定变量的实践值和守候事务情形,以是能够说level12是最为具体的trace了。
同时我们也晓得,关于trace了局,oracle供应了tkprof有用程序用来格局化trace文件,供应一份更简单读懂的trace了局。
那末为何还要间接读取trace文件呢?最主要的是tkprof的了局是不包括绑定变量值的,同时也不包含真实的SQL实行按次,而trace文件中我们则能够看到依照工夫分列的parse,binds,executes,fetch等等,这在某西场所下是很有效处的。另有就是,假如你可以间接读取这些让人看得眼晕的trace,是否是会有一种很爽,很大家的感到:-)
固然假如我们要依据一些尺度(好比CPU时长,磁盘读取量等)举行trace中的SQL排序,那末tkprof是我们独一的选择,能够参看coolyl的Tkprof工具先容和剖析。
上面是metalink中的这篇文章的大致翻译,年夜部分名词用英文反而更好,就不强加翻译了,信任人人都看得懂。固然也是对照懒的缘故原由:-)
文本总结了trace了局原始输入文件中的内容。
----------------------------------------------------------------------------
APPNAMEmod=%smh=%luact=%sah=%lu
----------------------------------------------------------------------------
APPNAME:Applicationnamesetting。在Oracle7.2和以上版本中呈现。这个称号能够由DBMS_APPLICATION_INFO包来设定。
mod:Modulename
mh:Modulehashvalue
act:Action
ah:Actionhashvalue
好比:APPNAMEmod=SQL*Plusmh=3669949024act=ah=4029777240
----------------------------------------------------------------------------
PARSINGINCURSOR#<CURSOR>len=Xdep=Xuid=Xoct=Xlid=Xtim=Xhv=Xad=X
<statement>
ENDOFSTMT
----------------------------------------------------------------------------
<CURSOR>:Cursornumber
len:LengthofSQLstatement,SQL语句的长度
dep:Recursivedepthofthecursor,以后SQL语句的递规深度,假如为0则暗示是用户提交的SQL,为1则是因为用户SQL而招致Oracle背景本人实行的SQL,为2则是由1级SQL持续引发的下一级SQL。
uid:Schemauseridofparsinguser
oct:Oraclecommandtype.
lid:Privilegeuserid.
tim:Timestamp。在Oracle9i之前单元是1/100秒,9i则是1/1,000,000秒。使用这个值能够盘算一个SQL实行了究竟多长工夫。这个值就是以后行被写进trace文件时数据库V$TIMER视图的值。
hv:Hashid.
ad:SQLTEXTaddress,SQLTEXT的地点,跟V$SQLAREA和V$SQLTEXT视图中的ADDRESS字段值相称。
<statement>:TheactualSQLstatementbeingparsed.
----------------------------------------------------------------------------
PARSEERROR#%d:len=%lddep=%duid=%ldoct=%dlid=%ldtim=%luerr=%d
<statement>...
----------------------------------------------------------------------------
PARSEERROR:在Oracle7.2以上版本中剖析的毛病会写进trace文件中。
len:LengthofSQLstatement.
dep:Recursivedepthofthestatement
uid:Userid.
oct:Oraclecommandtype(ifknown).
lid:Privilegeuserid.
tim:Timestamp.
err:Oracleerrorcode(e.g.ORA-XXXXX)reported
<statement>:TheSQLstatementthaterrored.
----------------------------------------------------------------------------
PARSE#<CURSOR>:c=0,e=0,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=0
EXEC#<CURSOR>:c=0,e=0,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=0
FETCH#<CURSOR>:c=0,e=0,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=0
UNMAP#<CURSOR>:c=0,e=0,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=0
----------------------------------------------------------------------------
PARSE:Parseastatement.剖析一个SQL
EXEC:Executeapre-parsedstatement.实行已剖析终了的SQL
FETCH:Fetchrowsfromacursor.从游标中失掉数据,一般指select前往纪录
UNMAP:假如游标利用了一时表(temporarytable),当游标封闭的时分将会看到UNMAP
c:CPUtime(100thsofasecondinOracle7,8and9).
e:Elapsedtime(100thsofasecondOracle7,8.MicrosecondsinOracle9onwards).
p:Numberofphysicalreads.
cr:NumberofbuffersretrievedforCRreads.
cu:Numberofbuffersretrievedincurrentmode.
mis:Cursormissedinthecache.
r:Numberofrowsprocessed.
dep:Recursivecalldepth(0=userSQL,>0=recursive).
og:Optimizergoal:1=All_Rows,2=First_Rows,3=Rule,4=Choose
tim:Timestamp(largenumberin100thsofasecond).
好比:FETCH#2:c=0,e=106,p=0,cr=3,cu=0,mis=0,r=1,dep=1,og=4,tim=6005498548671
----------------------------------------------------------------------------
ERROR#%d:err=%dtim=%lu
----------------------------------------------------------------------------
实行大概fetch以后呈现的SQLError
err:Oracleerrorcode(e.g.ORA-XXXXX)atthetopofthestack.
tim:Timestamp.
----------------------------------------------------------------------------
STAT#<CURSOR>id=Ncnt=0
----------------------------------------------------------------------------
<CURSOR>的实行企图.
<CURSOR>:Cursorwhichthestatisticsapplyto.
id:Lineoftheexplainplanwhichtherowcountappliesto(从1入手下手).
cnt:Numberofrowsforthisrowsource.
pid:Parentidofthisrowsource.
pos:Positioninexplainplan.
obj:Objectidofrowsource(ifthisisabaseobject).
op:Therowsourceaccessoperation.
好比:
STAT#2id=2cnt=0pid=1pos=1obj=510op=TABLEACCESSBYINDEXROWIDOBJECT_USAGE(cr=2r=0w=0time=83us)
STAT#2id=3cnt=1pid=2pos=1obj=511op=INDEXRANGESCANI_STATS_OBJ#(cr=1r=0w=0time=43us)
----------------------------------------------------------------------------
XCTENDrlbk=%drd_only=%d
----------------------------------------------------------------------------
XCTEND是事件停止的标记.
rlbk:1ifarollbackwasperformed,0ifnorollback(commit).
rd_only:1iftransactionwasreadonly,0ifchangesoccurred.
----------------------------------------------------------------------------
BINDS#%d:
bind0:dty=2mxl=22(22)mal=00scl=00pre=00oacflg=03oacfl2=0size=24offset=0
bfp=02fedb44bln=22avl=00flg=05
value=10
----------------------------------------------------------------------------
BIND:Variablesboundtoacursor.
bindN:Thebindpositionbeingbound.
dty:Datatype.
mxl:Maximumlengthofthebindvariable(privatemaxleninparen).
mal:Arraylength.
scl:Scale.
pre:Precision.
oacflg:Specialflagindicatingbindoptions
oacflg2:Continuationofoacflg
size:Amountofmemorytobeallocatedforthischunk
offset:Offsetintothischunkforthisbindbuffer
bfp:Bindaddress.
bln:Bindbufferlength.
avl:Actualvaluelength(arraylengthtoo).
flg:Specialflagindicatingbindstatus
value:Theactualvalueofthebindvariable.
好比:
BINDS#4:
bind0:dty=2mxl=22(22)mal=00scl=00pre=00oacflg=08oacfl2=1size=24offset=0
bfp=ffffffff7ce64ee0bln=22avl=01flg=05
value=0
bind1:dty=1mxl=32(11)mal=00scl=00pre=00oacflg=18oacfl2=1size=32offset=0
bfp=ffffffff7ce6b128bln=32avl=11flg=05
value="TABCOMPART$"
bind2:dty=2mxl=22(22)mal=00scl=00pre=00oacflg=08oacfl2=1size=24offset=0
bfp=ffffffff7ce6bae8bln=24avl=02flg=05
value=1
----------------------------------------------------------------------------
WAIT#<CURSOR>:nam="<eventname>"ela=0p1=0p2=0p3=0
----------------------------------------------------------------------------
WAIT:Aneventthatwewaitedfor.
nam:Whatwasbeingwaitedfor.
ela:Elapsedtimefortheoperation.
p1:P1forthegivenwaitevent.
p2:P2forthegivenwaitevent.
p3:P3forthegivenwaitevent.
好比(FullTableScan):
WAIT#1:nam="dbfilescatteredread"ela=5p1=4p2=1435p3=25
在游标1上履历了"dbfilescatteredread"守候事务,一共等了0.05秒,在读取File4,从1435block入手下手,读了25个block
好比(IndexScan):
WAIT#1:nam="dbfilesequentialread"ela=4p1=4p2=1224p3=1
在游标1上履历了"dbfilesequentialread"守候事务,一共等了0.04秒,在读取file4,block1224,读取了这一个block
关于每个守候事务的寄义和p1,p2,p3暗示的意义,能够参考OracleDatabaseReference文档的OracleWaitEvents章节。
对于update操作,只需要把event中的旧行和新行值对调即可。 对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。 是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。 我个人认为就是孜孜不懈的学习 但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。 SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。 只能告诉你,学好数据库语言和原理,多见识几种数据库软件,比一棵树上吊死要好。 比如日志传送、比如集群。。。 如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。 总感觉自己还是不会SQL
页:
[1]