INFORMIX FAQ(1)
如何加快查询的速度?
Question:为什么在一个有30000条记录并且建立有索引的表进行操作很慢,怎么办?
30000条记录并不是太多,你会感觉有慢不应该是记录数太多的缘故,原因可能是每条记录太长,或者你的机器的性能十分低,不过还是有一些方法可能会对性能有所帮助:
1.更新统计信息(update satistics on tablename),这很容易作,并且有可能会带来性能的提高。
2.删除,然后再重新创建索引。这样作能够增加索引的连续性。但是要求是DBA或者有创建索引的权限。
3.ALTER INDEX idxname TO CLUSTER: 这样作的目的是重新创建表并且通过索引来重新排列记录。结果是强制使记录在逻辑上连续,并且提高物理上的连续性。这样作的代价最大,但是效果最好。但是,一个表中只能有一个cluster index,并且,重新排列记录可能会强迫其他的查询使用其他的索引。作这种工作,你必须要为DBA或者有alter table 的权限。并且请注意,在你运行cluster index的时候,你必须要有足够的空间,因为在为一个表创建cluster index的时候,会拷贝表中所有的记录到一个临时表中,在临时表中进行排序操作,然后会删除原来的表,然后将临时表的名字改为原始表的名字。因此,如果这个表中的数据变化很大,如经常要进行大量的插入/删除的操作,这样作的好处就体现不出来。
应该使用online的mirroring功能吗?
Question:应该使用online的mirroring功能吗?
informix6.0以上的版本开始支持镜像(mirroring),镜像可以将相同的数据复制到多个磁盘上,当一个磁盘坏掉,online可以继续使用镜像磁盘来代替坏掉的磁盘。
一些操作系统(如HP-UX)也提供镜像的功能,还有硬件方式的镜像,三种镜像方式哪一种更好呢?
通常硬件镜像更好。因为它最快,然后是操作系统的镜像,最后才是ONLINE镜像。ONLINE镜像需要作一些逻辑上的运算,用于判断如何处理down掉的chunk。而是使用HP-UX或者硬件上的镜像不会出现这种情况。
HP的逻辑卷管理可以让你以“stripe"的方式将extents以轮转的方式分别存储在多个磁盘上。如果你使用数据分片策略,这也许会/也许不会带来性能的提高。
如果你使用HP-UX的磁盘镜像,在主磁盘繁忙的时候,读盘操作会被转移到镜像盘上,在磁盘负载很重的情况下,这会带来很大的性能提高。
关于NFS?
1.我们可以在远程主机上运行应用程序吗?(如C程序,shell scripts,perl scripts等等)运行的性能和在本地运行同样的程序相比如何?
由于NFS mounts远程主机上的文件系统到你的本地计算机,你可以象存取本地磁盘一样存取远程文件系统。这对性能的影响不大。
2.运行NFS需要什么软件?
只需要NFS和TCP/IP。
3.管理NFS是否困难?
主要的困难来自你必须要维护你的分布式文件的UID和GID必须要同步。使用NIS会使这项工作变得容易一点。
如何使用cron自动进行数据库备份?
echo '\n0' | tbtape -s 1 | head -100
如何知道一个表存在在哪些dbspace上?
以下是一些sql语句:
SELECT TRUNC(partnum/16777216) dbspace, COUNT(*) tables,
SUM(nrows) tot_rows, SUM(nrows*rowsize) bytes FROM systables
WHERE tabtype = 'T' GROUP BY 1 ORDER BY 1;
如果你在你的数据库中创建一个叫做'dbspaces'的表,然后将onstat -D的输出的dbspace名称放入这个表中,然后你就可以用:
SELECT dbs_name[1,12] dbspace,
COUNT(*) tables, SUM(nrows) tot_rows,
SUM(nrows*rowsize) bytes
FROM systables, dbspaces
WHERE tabtype = 'T'
AND dbs_no = trunc(partnum/16777216)
GROUP BY 1 ORDER BY 1;
输出为:
dbspace tables tot_rows bytes
mcs_aaaaa 28 51 3715
mcs_catalog 22 2695 114810
mcs_eeeee 25 224 45446
mcs_fffff 32 1412 201445
mcs_mmmmm 35 165 262599
mcs_wwwww 28 449 79385
注意:(“byte"仅仅为数据的字节数,不包括索引和其他的开销)
怎样使用“informix”用户和"informix"组?
1.是否应该使用informix帐号来管理数据库,例如:grant/revoke权限,创建/删除表,dbload等等。
2.应该创建一个单独的帐号来作这些事情吗?为什么?
3.是否应该用informix帐号来管理数据库应用程序,并且将所有的用户置于这个组内,?
我们仅仅使用informix帐号来进行DBA的管理工作,而不是用它来做所有的事情,你应该有一个informix帐号和一个informix组,帐号和组都是唯一的。在informix组中只应该有informix一个用户。
我们有一个“应用”帐号,这个帐号是所有的非系统表的属主,并且用它设置所有的权限,拥有所有的资源,数据,和可执行目录和代码。这样做的目的是隔离数据管理和服务器管理两种不同的工作。DBA的功能是独立的,(并且只有一个人可以执行这个工作),如果你的数据库规模很大或者即将变得很大,你会体会到这样作的好处。
如果你脱离这个原则,会出现严重的安全隐患。informix组内的其他用户可以执行INFORMIXDIR目录下的很多应用程序,而这些应用程序你一定不希望由他去执行。所以没有必要去冒险将所有的用户放在informix组中。