最近在整理一些关于SAP性能方面的信息,在涉及到数据库性能的时候,一般我们使用ST04来察看,虽然自己之前也做过ORACLE DBA相关的工作,但是就ST04也能给相关数据,但是就理解而言还是不是友好的,于是就想知道ST04是如何获取这些相关数据,通过程序的分析,ST04其处理数据的逻辑通过CL_DB6_TREE_NAVIGATOR进行管控的,后续会依据不同ACTION的值,找到对应类,而这样会调用相关的函数或直接调用NATIVE SQL语句。那些ALV 字段描述都是通过这些ACTION 类进行预先的定义。
我们知道SAP对NATIVE SQL 语句调用,可以与命令或通过类进行的(因为这边的数据库是ORACLE)所以这些是通过CL_SQL_STATEMENT进行的,我们知道ORACLE的性能的数据基本都存放v$或其他x$等相关表,这些是无法在SAP的DDIC上查看的。
那么ST04每个ACTION到底发送那些SQL语句呢,还好SAP的基本都是通过类来进行的,也就是说只要把断点放在CL_SQL_STATEMENT的EXECUTE_QUERY
最后我们可以看到以下SQL语句
SELECT VERSION FROM V$INSTANCE
SELECT T2.INST_ID, T2.PADDR, T2.NAME FROM GV$PROCESS T1, GV$BGPROCESS T2 WHERE T1.INST_ID = T2.INST_ID AND T1.ADDR = T2.PADDR
SELECT T1.INST_ID, T1.SID, T1.PADDR, T1.USERNAME,T1.SQL_ADDRESS, T1.SQL_HASH_VALUE, T1.SQL_CHILD_NUMBER, T1.CLIENT_INFO, T1.CLIENT_IDENTIFIER, T2.SPID, T2.PROGRAM, T1.PROCESS, T1.MACHINE, T1.PROGRAM, T1.COMMAND, T1.STATUS, T1.TYPE, decode(T1.STATE,'WAITING', T1.EVENT, 'CPU'), T1.WAIT_TIME, T1.SECONDS_IN_WAIT, T1.P1TEXT, T1.P1, T1.P2TEXT, T1.P2, T1.P3TEXT, T1.P3, T1.MODULE, T1.ACTION, T4.BLOCK_GETS, T4.CONSISTENT_GETS, (T4.BLOCK_GETS + T4.CONSISTENT_GETS) LOGICAL_READS, T4.PHYSICAL_READS, T4.BLOCK_CHANGES, T4.CONSISTENT_CHANGES, T5.SQL_TEXT, T2.PGA_USED_MEM, T2.PGA_ALLOC_MEM, T2.PGA_FREEABLE_MEM, T2.PGA_MAX_MEM, T1.ROW_WAIT_OBJ#, T1.ROW_WAIT_FILE#, T1.ROW_WAIT_BLOCK#, T1.ROW_WAIT_ROW#, T6.HOST_NAME FROM GV$SESSION T1, GV$PROCESS T2, GV$SESS_IO T4, GV$SQLTEXT T5, GV$INSTANCE T6 WHERE T1.INST_ID = T4.INST_ID AND T1.SID = T4.SID AND T1.INST_ID = T2.INST_ID AND T1.PADDR = T2.ADDR AND T1.INST_ID = T6.INST_ID AND T1.INST_ID = T5.INST_ID(+) AND T1.SQL_ID = T5.SQL_ID(+) ORDER BY T1.INST_ID, T1.SID, T5.PIECE
可以看到就算SAP最后以ALV的方式来显示出来,也未必符合常规DBA看到信息,更不用说我们ABAP人员来看。
既然ST04的数据基于NATIVE SQL的语句来获取,那么我们就可以开发类似ST04的语句,符合我们常用的方法和网路上获取的脚本,这样DBA和ABAP都可以看懂脚本的内容。
于是自己开发一个查看数据库性能的工具(这边是基于ORACLE数据的)
测试代码如下
*##(1)
Hit Ratio.sql
*##(2)
物理度命中率
*##(3)
Name
Hit Ratio%
*##(5)
select name, ((consistent_gets + db_block_gets) - physical_reads) / (consistent_gets + db_block_gets) * 100 HitRatio
from v$buffer_pool_statistics
where physical_reads > 0
*##(6)
因为简单测试,这边就从PC端来获取脚本,当然后续可以一些常用脚本写入到数据库
脚本2
*##(1)
Hit Ratio2.sql
*##(2)
db block buffer efficiency
*##(3)
Cache Hit Ratio%
*##(5)
SELECT round(1 - (phy.value / (cur.value + con.value)),4)*100 CACHEHITRATIO
FROM v$sysstat cur, v$sysstat con, v$sysstat phy
WHERE cur.name = 'db block gets' AND con.name = 'consistent gets' AND phy.name = 'physical reads'
*##(6)
命中率不能小于....
上面的实现的规则,就是只要符合NATIVE语句,通过字段的匹配来动态生成内表,通过NATIVE SQL 类结果匹配的关系,动态把查询匹配给内表。
这样的话,可以动态的扩展ST04的功能,当然还有可以执行一些更新或其他的语句 就不在这边讨论的。
关于NATIVE SQL 的 相关的介绍,可以参考SAP DEMO PACKAGE: SDB_ADBC 中的实例!
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/203545/viewspace-1709552/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/203545/viewspace-1709552/