您的当前位置:首页ORACLE SQL语句的监控

ORACLE SQL语句的监控

2020-05-13 来源:小侦探旅游网
oracleSQL语句的监控

有时候想看看软件后台数据库到底执行了什么语句。比如大的erp系统,我们在查询的时候,后台执行了什么语句或者过程都存储在v$sql表中。但是当sql语句很长的时候就出现了截断显现。比如selectsql_textfromv$sql;其中有一条不完整的sql语句:SELECTLSWLDW.LSWLDW_WLDWBHasCustomersCode,LSWLDW.LSWLDW_DWMCasCustomersName,LSWLDW.LSWLDW_DWLBasCustomerSorts,LSDWLB_LBMCASCustomerSortName,LSWLDW.LSWLDW_DQBHasCustomerAreas,LSDQZD_DQMCASCustomerAreaName,LSWLDW.HelpTag,LSWLDW.LSWLDW_JCasShortName,nvl(LSWLDW.LSWLDW_SH,'')asSH,LSWLDW.IsDetailasDetail,LSWLDW.Layer,LSWLDW.OfTrade,nvl(LSWLDW.LSWLDW_CJDW,'')asLSWLDW_CJDW,LSWLDW.OfTradeASOfTradeCode,nvl(OfTradeItem.\"NAME\')ASOfTradeName,nvl(OwnerType.\"NAME\')ASOwnerTypeFromLSWLDWLEFTOUTERJOINLSDWLBONLSWLDW.LSWLDW_DWLB=LSDWLB.LSDWLB_LBBHLEFTOUTERJOINCodeItemsOfTradeItemONLSWLDW.OfTrade=OfTradeItem.CodeANDOfTradeItem.SetID='A003'LEFTOUTERJOINCodeItemsOwnerTypeONLSWLDW.OwnerType=OwnerType.CodeANDOwnerType.SetID='A004'LEFTOUTERJOINLSDQZDONLSWLDW.LSWLDW_DQBH=LSDQZD.LSDQZD_DQBHandLSWLDW_TYBZ='0'andLSWLDW.LSWLDW_WLDWBHin(selectLSWLDW_WLDWBHfrom(selectRownumrn,LSWLDW_WLDWBHfrom(selectLSselectLS下面的语句就被截断了.where1=1第一种解决方法:通过sql语句实现我们查找该语句的sql_id或者hash_valueselectsql_text,sql_id,hash_valuefromv$sql结果为:sql语句3fvcnc7ngu0gp3908895221通过查询v$sqltext显示完整的sql语句selectsql_textfromv$sqltextwherehash_value='3908895221'orderbypiece;或者fromv$sqltextwheresql_id='3fvcnc7ngu0gp'orderbypiece;查询出来的结果到文本编辑器中整理格式就可以了.第二种方法:使用sqlplus在V$sql中有sql_fulltext字段,它存储这完整的sql,字段类型是clob首先设置sqlplussetheadingoffsetlong40000其次输入查询语句selectsql_fulltextfromv$sqlwheresql_id='3fvcnc7ngu0gp';或者使用语句selectdbms_lob.substr(sql_fulltext)fromv$sqlwheresql_id='3fvcnc7ngu0gp';就能够得出完整的sql。第三种解决方法:使用第三方工具在V$sql中有sql_fulltext字段,它存储这完整的sql,字段类型是clob.使用pl/sqldev直接打开就能看到完整的代码.一般的第三方oracle工具够有次功能。下面是完整的sql语句:SELECTLSWLDW.LSWLDW_WLDWBHasCustomersCode,LSWLDW.LSWLDW_DWMCasCustomersName,LSWLDW.LSWLDW_DWLBasCustomerSorts,LSDWLB_LBMCASCustomerSortName,LSWLDW.LSWLDW_DQBHasCustomerAreas,LSDQZD_DQMCASCustomerAreaName,LSWLDW.LSWLDW_JCasShortName,nvl(LSWLDW.LSWLDW_SH,'')asSH,LSWLDW.IsDetailasDetail,LSWLDW.Layer,LSWLDW.OfTrade,nvl(LSWLDW.LSWLDW_CJDW,'')asLSWLDW_CJDW,LSWLDW.OfTradeASOfTradeCode,nvl(OfTradeItem.\"NAME\')ASOfTradeName,nvl(OwnerType.\"NAME\')ASOwnerTypeFromLSWLDWLEFTOUTERJOINLSDWLBONLSWLDW.LSWLDW_DWLB=LSDWLB.LSDWLB_LBBHLEFTOUTERJOINCodeItemsOfTradeItemONLSWLDW.OfTrade=OfTradeItem.CodeANDOfTradeItem.SetID='A003'LEFTOUTERJOINCodeItemsOwnerTypeONLSWLDW.OwnerType=OwnerType.CodeANDOwnerType.SetID='A004'LEFTOUTERJOINLSDQZDONLSWLDW.LSWLDW_DQBH=LSDQZD.LSDQZD_DQBHZ='0'andLSWLDW.LSWLDW_WLDWBHinwhere1=1andLSWLDW_TYB(selectLSWLDW.HelpTag,(selectLSWLDW_WLDWBHfromRownumrn,LSWLDW_WLDWBHfrom(selectLSWLDW_WLDWBHfromlswldwandLwhere1=1SWLDW_TYBZ='0'orderbylswldw_wldwbh)whereRownum<=12ORDERBYLSWLDW.LSWLDW_WLDWBH。)wherern>=1)如果还有好的方法,请赐教。谢谢!v$sqlarea,v$sql,v$sqltext提供的sql语句区别?来源:本站整理作者:佚名时间:2006-08-0220:46:33v$sqltext存储的是完整的SQL,SQL被分割SQL>descv$sqltextNameNull?Type-----------------------------------------------------------------------------ADDRESSRAW(4)---------HASH_VALUENUMBER---------和address一起唯一标志一条sqlCOMMAND_TYPENUMBERPIECENUMBER----------分片之后的顺序编号SQL_TEXTVARCHAR2(64)--------------注意长度v$sqlarea---------存储的SQL和一些相关的信息,比如累计的执行次数,逻辑读,物理读等统计信息SQL>descv$sqlareaNameNull?Type-----------------------------------------------------------------------------SQL_TEXTVARCHAR2(1000)SHARABLE_MEMNUMBERPERSISTENT_MEMNUMBERRUNTIME_MEMNUMBERSORTSNUMBERVERSION_COUNTNUMBERLOADED_VERSIONSNUMBEROPEN_VERSIONSNUMBERUSERS_OPENINGNUMBERFETCHESNUMBEREXECUTIONSNUMBERUSERS_EXECUTINGNUMBERLOADSNUMBERFIRST_LOAD_TIMEVARCHAR2(38)INVALIDATIONSNUMBERPARSE_CALLSNUMBERDISK_READSNUMBERBUFFER_GETSNUMBERROWS_PROCESSEDNUMBERCOMMAND_TYPENUMBEROPTIMIZER_MODEVARCHAR2(25)PARSING_USER_IDNUMBERPARSING_SCHEMA_IDNUMBERKEPT_VERSIONSNUMBERADDRESSRAW(4)HASH_VALUENUMBERMODULEVARCHAR2(64)MODULE_HASHNUMBERACTIONVARCHAR2(64)ACTION_HASHNUMBERSERIALIZABLE_ABORTSNUMBERCPU_TIMENUMBERELAPSED_TIMENUMBERIS_OBSOLETEVARCHAR2(1)CHILD_LATCHNUMBERv$sql----------存储的是具体的SQL和执行计划相关信息,实际上,v$sqlarea可以看做v$sql根据sqltext等做了groupby之后的信息SQL>descv$sqlNameNull?Type-----------------------------------------------------------------------------SQL_TEXTVARCHAR2(1000)SHARABLE_MEMNUMBERPERSISTENT_MEMNUMBERRUNTIME_MEMNUMBERSORTSNUMBERLOADED_VERSIONSNUMBEROPEN_VERSIONSNUMBERUSERS_OPENINGNUMBERFETCHESNUMBEREXECUTIONSNUMBERUSERS_EXECUTINGNUMBERLOADSNUMBERFIRST_LOAD_TIMEVARCHAR2(38)INVALIDATIONSNUMBERPARSE_CALLSNUMBERDISK_READSNUMBERBUFFER_GETSNUMBERROWS_PROCESSEDNUMBERCOMMAND_TYPENUMBEROPTIMIZER_MODEVARCHAR2(10)OPTIMIZER_COSTNUMBERPARSING_USER_IDNUMBERPARSING_SCHEMA_IDNUMBERKEPT_VERSIONSNUMBERADDRESSRAW(4)TYPE_CHK_HEAPRAW(4)HASH_VALUENUMBERPLAN_HASH_VALUENUMBERCHILD_NUMBERNUMBER----------注意这个MODULEVARCHAR2(64)MODULE_HASHNUMBERACTIONVARCHAR2(64)ACTION_HASHNUMBERSERIALIZABLE_ABORTSNUMBEROUTLINE_CATEGORYVARCHAR2(64)CPU_TIMENUMBERELAPSED_TIMENUMBEROUTLINE_SIDNUMBER--------------注意这里跟outline有关CHILD_ADDRESSRAW(4)SQLTYPENUMBERREMOTEVARCHAR2(1)OBJECT_STATUSVARCHAR2(19)LITERAL_HASH_VALUENUMBERLAST_LOAD_TIMEVARCHAR2(38)IS_OBSOLETEVARCHAR2(1)CHILD_LATCHNUMBER另外注意这个QL>descv$sql_planNameNull?Type-----------------------------------------------------------------------------ADDRESSRAW(4)HASH_VALUENUMBERCHILD_NUMBERNUMBER------------注意这个和v$sql里面的相同字段OPERATIONVARCHAR2(60)OPTIONSVARCHAR2(60)OBJECT_NODEVARCHAR2(20)OBJECT#NUMBEROBJECT_OWNERVARCHAR2(30)OBJECT_NAMEVARCHAR2(64)OPTIMIZERVARCHAR2(40)IDNUMBERPARENT_IDNUMBERDEPTHNUMBERPOSITIONNUMBERSEARCH_COLUMNSNUMBERCOSTNUMBERCARDINALITYNUMBERBYTESNUMBEROTHER_TAGVARCHAR2(70)PARTITION_STARTVARCHAR2(10)PARTITION_STOPVARCHAR2(10)PARTITION_IDNUMBEROTHERVARCHAR2(4000)DISTRIBUTIONVARCHAR2(40)CPU_COSTNUMBERIO_COSTNUMBERTEMP_SPACENUMBERACCESS_PREDICATESVARCHAR2(4000)FILTER_PREDICATESVARCHAR2(4000)实际上,看起来同样的一句SQL,往往具有不同的执行计划如果是不同的数据库用户,那么相应的涉及的对象可能都不一样,注意v$sql中OBJECT#NUMBEROBJECT_OWNERVARCHAR2(30)OBJECT_NAMEVARCHAR2(64)OPTIMIZERVARCHAR2(40)即使是相同的数据库用户,若session的优化模式、session级的参数等不一样,执行计划也能不同。所以即使相同的sql,也可能具有不同的执行计划!v$sqljointov$sql_plan就代表了具体的sql的执行计划,通过下面3个字段做连接ADDRESSRAW(4)HASH_VALUENUMBERCHILD_NUMBERNUMBER而v$SQLAREA忽略了执行计划等差异,只是在形式上sql文本看起来一样!相当于做了个聚合,是多个不同执行计划的sql的聚合和累计信息首先,你要以dba身份登陆数据库。第二,为某个用户开启sql跟踪。那个用户就是你要跟踪的、正在执行sql语句的那个用户。命令如下:executedbms_system.set_sql_trace_in_session(sid,serial#,true)其中参数的意义是,sid-会话id,serial#-序列号,这两个参数可以从v$session中得到。第三,上面的命令执行成功之后数据库就自动对该用户所发出的所有sql语句进行跟踪,并把结果写在用户跟踪文件里。用户跟踪文件存放在数据库服务器上,路径请参考init.ora文件中的udump参数值。文件名为ora_sid_xxxx.trc(fororaxxxxx.trc(forunix)或者NT),其中xxxx文件系统进程编号,这个编号可以从v$process和v$session两个表通过关联的方式查询得到。当然你也可以简单的查看一下哪个trc文件的日期最新,哪个文件就是你要的结果了。第四,如果你觉得可以了,那么就关闭对该用户的跟踪吧。executedbms_system.set_sql_trace_in_session(sid,serial#,false)(1).查看相关进程在数据库中的会话Selecta.sid,a.serial#,a.program,a.status,substr(a.machine,1,20),a.terminal,b.spidfromv$sessionwhereanda,v$processba.paddr=b.addr=&spid;b.spid(2).查看数据库中被锁住的对象和相关会话selecta.sid,a.serial#,a.username,a.program,c.owner,fromv$sessiona,c.object_nameb,all_objectscv$locked_objectwherea.sid=b.session_id=andc.object_idb.object_id;(3).查看相关会话正在执行的SQLselectsql_textfromv$sqlareawhereaddress=(selectsql_address=from&sid);v$sessionwheresidV$sqlarea的语句是不完整的v$sqltext上可以查询到完整语句,但仅仅也是在缓冲区中的.可以结合v$session查询如果想知道用户的语句.有几种办法的1、跟踪2、审计3、Trigger4、logmnr(仅仅dml)SELECT*FROMv$sqltextORDERBY1,4这就是服务器上正在执行的完成的sql语句。SELECTosuser,username,sql_textbfromv$sessiona,v$sqltextwherea.sql_addressaddress,=b.addressorderbypiece;V$SQLTEXT本视图包括Sharedpool中SQL语句的完整文本,一条SQL语句可能分成多个块被保ColumnewADDRESS存于多个记录内。注:V$SQLAREA只包括头1000个字符。V$SQLTEXT中的常用列lHASH_VALUE:SQL语句的Hash值lADDRESS:sql语句在SGA中的地址lSQL_TEXT:SQL文本。lPIECE:SQL语句块的序号V$SQLTEXT中的连接列ViJoinedColumn(s)HASH_VALUE,ADDRESSV$SQL,V$SESSIONHASH_VALUE,ADDRESSHASH_VALUE.V$SESSIONSQL_HASH_VALUE,SQL_ADDRESS示例:已知hash_value:3111103299,查询sql语句:select*fromv$sqltextwherehash_value='3111103299'orderbypieceV$SQLAREA本视图持续跟踪所有sharedpool中的共享cursor,在sharedpool中的每一条SQL语句都对应一列。本视图在分析SQL语句资源使用方面非常重要。V$SQLAREA中的信息列lHASH_VALUE:SQL语句的Hash值。lADDRESS:SQL语句在SGA中的地址。这两列被用于鉴别SQL语句,有时,两条不同的语句可能hash值相同。这时候,必须连同ADDRESS一同使用来确认SQL语句。lPARSING_USER_ID:为语句解析第一条CURSOR的用户lVERSION_COUNT:语句cursor的数量lKEPT_VERSIONS:lSHARABLE_MEMORY:cursor使用的共享内存总数lPERSISTENT_MEMORY:cursor使用的常驻内存总数lRUNTIME_MEMORY:cursor使用的运行时内存总数。lSQL_TEXT:SQL语句的文本(最大只能保存该语句的前1000个字符)。lMODULE,ACTION:使用了DBMS_APPLICATION_INFO时session解析第一条cursor时的信息V$SQLAREA中的其它常用列lSORTS:语句的排序数lCPU_TIME:语句被解析和执行的CPU时间lELAPSED_TIME:语句被解析和执行的共用时间lPARSE_CALLS:语句的解析调用(软、硬)次数lEXECUTIONS:语句的执行次数lINVALIDATIONS:语句的cursor失效次数lLOADS:语句载入(载出)数量lROWS_PROCESSED:语句返回的列总数V$SQLAREA中的连接列ColumnewJoinedColumn(s)ViHASH_VALUE,ADDRESSV$SESSIONSQL_HASH_VALUE,SQL_ADDRESSHASH_VALUE,ADDRESSV$OPEN_CURSORV$SQLTEXT,V$SQL,HASH_VALUE,ADDRESSSQL_TEXT_CACHEV$DB_OBJECTNAME示例:1.查看消耗资源最多的SQL:SELECThash_value,executions,buffer_gets,disk_reads,parse_callsFROMV$SQLAREAWHEREbuffer_gets>10000000ORdisk_reads>1000000ORDERBYbuffer_gets+100*disk_readsDESC;2.查看某条SQL语句的资源消耗:SELECThash_value,buffer_gets,disk_reads,executions,parse_callsFROMV$SQLAREAWHEREhash_Value=228801498ANDaddress=hextoraw('CBD8E4B0');

因篇幅问题不能全部显示,请点此查看更多更全内容