常规会话统计信息 sysmaster 数据库中的 syssessions 表存储各个会话的常规信息,如登录名、登录时间、会话所登录的主机机器、操作系统的进程标识和当前状态等等。可以使用以下查询来查询该表来获取全部此类信息:select sid, username, hostname, connected logint_time, hex(state) s_state from syssessions 输出类似于: sid username hostname logint_time s_state 233989 omcadmin localhost 1041348844 0x00080021 233982 omcadmin gcsys-e1 1041348608 0x00080001 233981 omcadmin nysys4-e1 1041348608 0x00080001 233980 omcadmin nysys5-e1 1041348608 0x00080001 233979 omcadmin ffsys-e1 1041348608 0x00080001 233973 omcadmin nysys1 1041348608 0x00080001 233781 wsadmin2 gcmmi 1041346036 0x00080001 233697 omcadmin localhost 1041344008 0x00080001 233694 wsadmin4 nymmi1 1041343932 0x00080001 233693 wsadmin4 nymmi1 1041343932 0x00080001 230550 omcadmin nysys1 1041293396 0x00080001 230476 omcadmin ffsys-e1 1041292665 0x00080001 230421 omcadmin gcsys-e1 1041292365 0x00080001 230278 omcadmin nysys5-e1 1041291208 0x00080001 s_tate 是一个指出会话的当前活动状态的十六进制数,请参考Administrator's Guide的第 27-38 页,以获取对这其中每个活动状态的详细描述。login_time 是一个指出会话登录时间的整数,使用 C 程序很容易将它转换成常规时间格式。可以向 Informix 技术支持请求以获取该 C 程序。
sysmaster 数据库中的 syssesprof 表提供了各会话的更多详细信息。使用以下查询,您可以更好地理解各个会话是如何与数据库交互的:select sid, (isreads+bufreads+bufwrites+pagreads+pagwrites) access, locksheld, seqscans, total_sorts, dsksorts from syssesprof 输出如下所示: Sid access locksheld seqscans tot_sorts disksorts 233982 246 0 2 0 0 230421 7789 12 456 1000 0 225679 9981 213 669 876 2 247869 10098 440 578 98 2 78 70 45 6 0 0 447 46 89 6 0 0 access 字段显示了会话命中数据库的次数。locksheld 显示各会话正使用多少锁。seqscans 表明各会话使用顺序扫描访问数据的次数;如果该数字太高,比如说高于 100000,那么您可能要质疑会话是否曾经使用过索引来检索数据,而且要更仔细地检查其查询执行计划以确定它是否最佳。total_sorts 和 dsksorts 表明各会话使用内存进行排序操作的效率。您可能会使用以下公式来计算各会话使用内存进行排序的百分数:((total_sorts - dsksorts)/total_sorts)*100 该百分数越高,排序操作效率也就越高。 您可以将 syssessions 表与 syssesprof 表连接以进一步确定每个会话的用户名和主机机器名,以便了解哪些地方可能会出现数据库和系统问题。以下查询可以检索所有这类信息:select username, hostname, (isreads+bufreads+bufwrites+pagreads+pagwrites) access, locksheld, seqscans, total_sorts, dsksorts from syssessions s, syssesprof f where s.sid =f.sid
您也可以将 syssessions 表与 syslocks 表连接以获取关于锁的更多详细信息,如哪个会话当前锁定了哪个数据库中的哪个表,以此来帮助您确定各用户之间潜在的锁冲突: select owner, username, hostname, dbsname, tabname, type from syssessions s, syslocks l where sid = owner and tabname not like "sys%" order by 3,4,5,2 输出类似于: Owner username hostname dbsname tabname type 37514 111607 P615 ds1 bwl_file IX 37514 111607 P615 ds1 bwl_file U 37004 111217 P615 ds1 oea_file U 37004 111217 P615 ds1 oea_file IX 37004 111217 P615 ds1 oeb_file IX 1422 wsine apple prod customer S 如果在锁使用方面存在某些冲突,例如某个用户需要对已被别的用户锁定的表进行专有访问,那么您可以方便地确定该锁的所有者,并根据用户的优先级发出 onmode -z sid 命令来杀死会话,然后释放该锁;sid 这个编号是从上面输出中的 owner 字段中获取的;请注意,只有用户“Informix”可以执行该命令。
查询统计信息 查询统计信息对于故障诊断和查询优化至关重要。onstat -g sql sid 命令捕获当前会话的查询及相关统计信息;其中 sid 是会话标识,它可以通过硬编码手工插入,也可以通过 UNIX shell 脚本动态插入。例如,如果您想知道某个会话正在执行什么查询,那么您可能要首先使用命令 onstat -g ses 来查明其会话标识,然后将该标识插入上面的命令。例如,如果您想监控的会话标识为 35308,那么您可以使用 onstat -g sql 35308 来捕获其当前查询。 Informix Dynamic Server Version 7.31.FD6 -- On-Line -- Up 3 days 00:29:46 -- 1070912 Kbytes Sess SQL Current Iso Lock SQL ISAM F.E. Id Stmt type Database Lvl Mode ERR ERR Vers 35308 SELECT ds3 DR Wait 1 0 0 7.20 Current statement name : i0004284f_068ad023 Current SQL statement : SELECT img02,img03,img04,img23,img09,img10,img21,img37 FROM img_file WHERE img01 = 'SOM01367MF1N3MG84 ' AND 1=1 ORDER BY 1,2,5 Last parsed SQL statement : SELECT img02,img03,img04,img23,img09,img10,img21,img37 FROM img_file WHERE img01 = 'SOM01367MF1N3MG84 ' AND 1=1 ORDER BY 1,2,5 输出的第一部分给出了关于正在执行的查询的一些常规统计信息,如对哪个数据库执行查询、其隔离级别以及锁方式。最有趣的两个字段是 SQL error 和 ISAM error。如果这些字段非零,就表明查询出了一些问题,没有正确地执行。可以使用 Informix finderr 实用程序来查明到底是什么问题,随后在解决了该问题之后,杀死该会话并重新执行该查询。 “Current SQL statement”部分显示了正在执行的查询的完整 SQL 语法。它对于诊断问题查询和查询优化非常有帮助。如果您发现了该查询的一些问题,如响应时间太长,消耗了太多的系统 CPU 或内存,那么您可以按其显示状态为该查询制作一个副本,以便稍后研究和分析之用。您随后可以对 Informix dbaccess 实用程序运行同一个查询,以获取该查询性能方面更多详细的统计信息(如其执行计划和连接策略),从而确定问题的根源。根据研究所收集的统计信息,您可以进一步优化查询以获取更好的性能。“Last parsed SQL statement”部分显示了在内存中已经过解析的查询。由于在内存中已经解析过的查询在大多数情况下都是正在执行的查询,因此这一部分与前一部分在大多数时候都是相同的。
| | |