ST04-Oracle性能数据获取的感想
最近在整理一些关于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$SESSIONT1, GV$PROCESS T2, GV$SESS_IOT4, GV$SQLTEXTT5, GV$INSTANCET6 WHERE T1.INST_ID = T4.INST_ID ANDT1.SID = T4.SID ANDT1.INST_ID = T2.INST_ID AND T1.PADDR =
T2.ADDR ANDT1.INST_ID = T6.INST_ID
ANDT1.INST_ID = T5.INST_ID(+) ANDT1.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 中的实例!