INFORMIX FAQ(2)

---摘自互联网

如何知道数据库应用使用CPU的时间

通常在UNIX下面,可以使用time命令来得出一个进程说所占用的CPU的时间:

$ /bin/time test.4ge

real 9.0

user 1.6

sys .14

在这里,1.6+1.4 就是程序test.4ge所消耗的所有的CPU的时间。而“real”在这里不是特别重要。

然而在informix的环境中,time命令忽略了一个重要的方面,sqlturbo(数据库引擎)所使用的CPU时间。而且,如果你在一个应用程序中使用一个RUN语句,还要增加命令被RUN语句触发的时间。

一些操作系统(SCO Unix, Unix SVR4) 有一个叫做'timex"的命令,使用这个命令可以获得进程和其子进程所使用的CPU时间,在使用timex命令之前必须先打开记帐功能。

要打开记帐功能,首先用root用户登录系统,然后运行:

OS COMMAND

-------- -------------------------------------

SCO Unix $ /usr/lib/acct/accton /usr/adm/pacct

Unix SVR4  $ /usr/lib/acct/accton /var/adm/pacct

Others OS  $ man acct

当记帐功能打开之后,你就可以执行timex命令。使用-p选项(可以获得子进程使用的CPU时间)。

$ timex -p fglgo test.4gi

********

COMMAND RT END  REAL * CPU * CHARS BLOCKS

NAME USER TTYNAME TIME TIME (SECS) *(SECS)*TRNSFD  R/W

fglgo ignacio ttyp0 17:35:05 17:35:05 0.59 * 3.02 * 26256 9

#sqlturbo ignacio ttyp0 17:35:05 17:35:05 0.56 * 4.26 * 32248 12

********

‘timex'输出了两条记录,一条是应用程序本身,一条是sqlturbo所占用的CPU时间。如果在应用中使用了RUN语句,'timex'中还会有第三条记录包括run语句触发命令的时间。

为了获得整个CPU的使用时间,你必须将各个CPU字段中的时间加起来。

Total_CPU_time = fglgo_time + sqlturbo_time = 3.02 secs + 4.26 secs ==> Total_CPU_time = 7.28 secs

通常在想比较程序的两个不同版本的执行时间的时候可以使用timex。如果你要使用4GL程序(可能使用一条insert语句,或者提交一些存储过程),'timex'会告诉你哪个版本更好。而,当你可以根据CHARS TRNSFD字段来判断应用程序和sqlturbo之间 数据交换的频繁程度。

 

使用ISQL/DBACCESS来进行SELECT语句优化需要注意哪些事项?

当你使用ISQL/DBACCESS等工具来进行select语句的设计和优化的时候,请确认在你运行这个select语句的时候,将select 语句的输出定向到/dev/null文件中去。因为如果将ISQL/DBACCESS的输出到屏幕的时候,一次只输出一屏的数据,因此会造成时间上的延续。

 

如何知道一个database存储在哪个dbspace上面?

申明:如果使用create table ... in dbspace....语句,即使用数据分片,下面的的方法也许不会有用,但是大多少情况下都是可以用的:

对sysmaster表使用以下的语句:

select b.dbsname, a.name

from sysdbspaces a, systabnames b

where a.dbsnum= partdbsnum(b.partnum)

and b.tabname="systables" and b.dbsname="yourdbname"

 

在7.x以上的版本,可以用:

SELECT DBINFO("DBSPACE", HEX(partnum))

FROM systables WHERE tabname = "systables"

On 5.x instances, try: SELECT HEX(partnum)

FROM systables WHERE tabname = "systables"

在输出的最开始的两个字符(在0x的后面)可以看到chunk号, 通过这个chunk号,可以用onstat -d来获得dbspaces的名称。

 

如何找出数据库中使用的磁盘I/O最多的哪些线索?

在sysmaster数据库中运行以下的sql语句:

SELECT p.sid, username, tty, seqscans, dsksorts,

total_sorts from syssesprof p, syssessions s

WHERE p.sid = s.sid;

 

装载数据的时候如何清除掉重复的记录?

假设使用的是informix 7.22版本:执行如下的语句:

SET INDEXES idx_name DISABLED;

START VIOLATIONS TABLE FOR tab_name;

SET INDEXES idx_name ENABLED even better,

SET INDEXES idx_name FILTERING WITHOUT ERROR

然后装载数据

所有的重复的数据都将被放到violation和diagnositc表中,然后你就可以通过在violation表中调试哪些错误的记录,然后再将它们插入到主表中去。

 

为什么使用High Performance Loader装载数据的时候没有错误信息?

检查violation表,如果你没有特意对其命名的话,这些表的名称都是table_vio

和table_dia。在vio表中是出错记录,在dia表中是产生这些错误的原因。你可以使用tuple_id字段将两个表连接起来,并在HPL手册中查找出错的原因。

 

如何使用SMI表来查找一个表所占用的磁盘空间的大小?

执行以下sql语句:

select s.name dbspace, n.dbsname database,

sum(ti_nptotal) total, sum(ti_npused) used,

sum(ti_npdata) data, sum(ti_npused) - sum(ti_npdata) idx

from systabinfo i,systabnames n, sysdbspaces s

where i.ti_partnum = n.partnum and partdbsnum(i.ti_partnum)=s.dbsnum

group by 1,2

order by 1,2

 

如何在UNIX上存取NT上面的数据库?

UNIX系统之间可以通过设置.rhosts和hosts,equiv文件来实现UNIX系统之间存储数据库,而在NT下面将hosts.equiv文件放在c:\winnt\system32\drivers\etc下面即可。