在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查询。