在Informix上查找长期运行的查询?
时间:2020-03-05 18:49:51 来源:igfitidea点击:
我们如何找出Informix数据库服务器上长期运行的查询是什么?我有一个查询正在消耗CPU,并想找出查询是什么。
解决方案
回答
SELECT ELAPSED_TIME_MIN,SUBSTR(AUTHID,1,10) AS AUTH_ID, AGENT_ID, APPL_STATUS,SUBSTR(STMT_TEXT,1,20) AS SQL_TEXT FROM SYSIBMADM.LONG_RUNNING_SQL WHERE ELAPSED_TIME_MIN > 0 ORDER BY ELAPSED_TIME_MIN DESC
信誉:SQL以查看长期运行的查询
回答
这是因为建议的答案是针对DB2的,而不是针对Informix的。
sysmaster数据库(Informix共享内存的虚拟关系数据库)可能包含我们要查找的信息。这些页面可以入门:
- http://docs.rinet.ru/InforSmes/ch22/ch22.htm
- http://www.informix.com.ua/articles/sysmast/sysmast.htm
回答
如果查询当前正在运行,请观察onstat -g act -r 1输出,并查找rstcb不为0的项目
Running threads: tid tcb rstcb prty status vp-class name 106 c0000000d4860950 0 2 running 107soc soctcppoll 107 c0000000d4881950 0 2 running 108soc soctcppoll 564457 c0000000d7f28250 c0000000d7afcf20 2 running 1cpu CDRD_10
在此示例中,第三行是当前正在运行的行。如果我们有多行的rstcb值不为零,那么请注意寻找始终存在或者几乎始终存在的行。那很可能是我们要寻找的会话。
c0000000d7afcf20是此示例中我们感兴趣的地址。
使用onstat -u | grep c0000000d7afcf20查找会话
c0000000d7afcf20 Y--P--- 22887 informix - c0000000d5b0abd0 0 5 14060 3811
这将为我们提供会话ID,在我们的示例中为22887. 使用onstat -g ses 22887
列出有关该会话的信息。在我的示例中,这是一个系统会话,因此onstat -g ses输出中没有任何内容。
回答
好的,我花了点时间弄清楚如何连接到sysmaster。 JDBC连接字符串为:
jdbc:informix-sqli://dbserver.local:1526/sysmaster:INFORMIXSERVER=mydatabase
端口号与连接到实际数据库时的端口号相同。也就是说,如果连接字符串是:
jdbc:informix-sqli://database:1541/crm:INFORMIXSERVER=crmlive
然后,sysmaster连接字符串为:
jdbc:informix-sqli://database:1541/sysmaster:INFORMIXSERVER=crmlive
还发现了这个Wiki页面,其中包含许多用于对sysmaster表进行操作的SQL查询。