Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103682690
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: DB2/Informix

2008-04-07 08:15:23

  出处:Unix爱好者家园unix-cd.com  

 
常规会话统计信息
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”部分显示了在内存中已经过解析的查询。由于在内存中已经解析过的查询在大多数情况下都是正在执行的查询,因此这一部分与前一部分在大多数时候都是相同的。

 
阅读(906) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~