Informix技巧

Informix技巧4则本文内容均来自网络,这里仅是组织整理,方便记忆和查阅,以及供更多的人学习,如果有兴趣可到文中的“出处”查看原文。

--------------------------------------------------------------------------------

1. UPDATE STATISTICS FOR TABLE tablename( 出处:ChinaUnix )
     Informix 数据库服务器中的优化器为SQL语句的查询提供最有效的策略,估计查询策略的代价需要准确的统计信息(包括:记录数,表空间的页数,记录长度,字段不同值个数,索引的层数,索引叶结点数目,索引是升序还是降序或聚类索引),但是由于维护这些统计信息的代价是很大的,所以informix系统不是在每次修改时对统计值更新.因此当我们对数据库进行了大量的数据库操作(删除)时,如果想提高查询的效率,最好手动的更新系统表的统计信息,命令格式如下:
 UPDATE   STATISTICS   FOR   TABLE  tablename


2." could not do a physical order read to fetch next row" ( 出处:JavaYou )
      在大数据量操作数据库的时候,容易出现异常:"could not do a physical order read to fetch next row",这是 是因为Informix默认锁等待时间为0,即在操作(update、delete等)数据库的时候,如遇到其他操作也在使用同一张表的情况时,则不等待和返回异常。
       最简单的解决方法就是每次在获取新的(注意是新的,原有的连接也无妨,但影响效率)数据库连接时,首先执行设置连接的锁等待时间的Sql:
 SET  LOCK MODE  TO  WAIT  10    -- 意思是设置锁等待时间为10ms

 

3."DBSERVERNAME不在sqlhosts文件中 " ( 出处:JavaYou )
      在Windows下如果碰到问题:当初始化数据库或者做其它操作的时候提示DBSERVERNAME不在sqlhosts文件中,事实上Windows操作系统的Informix是不需要sqlhosts文件的,该文件仅存于UNIX操作系统。
       解决办法是:检查这样一个服务是否启动,该服务的名称是:Remote Registry Service,必须保证该服务启动。因为Informix数据库很多配置信息都存放在注册表中,如果没有启动该服务,则数据库无法读取注册表的信息。

 

4.导入导出
[导出]
 UNLOAD  TO  dataFile.dmp  SELECT   *   FROM  tablename
[导入]
 LOAD   FROM  dataFile.dmp  INSERT   INTO  tablename

***********************************************************************************************

使用3大数据库开发时的问题
在使用过的三大数据库Informix、DB2、Oracle中,因为涉及到不同的项目,所以都接触过,其中在开发使用中,出现不少最让人记忆深刻的问题,基本上都和数据库的不同实现特性有关,但一不小心还是让你深陷重围,下面举例一二,供大家参考:

Informix:

最大的问题出现在大数据量操作的时候会出现异常: "could not do a physical order read to fetch next row",查询Error Message手册和其他手册都查不到解决方法,无从下手,具体表现在大数据量操作数据库的时候,容易出现,最后终于在一个数据库论坛找到解决问题所在。

一方面可以在隔离级别的选择上进行改动(但并不彻底),另一方面则是因为Informix默认锁等待时间为0,即在操作(update、delete等)数据库的时候,如遇到其他操作也在使用同一张表的情况时,则不等待和返回异常。

最简单的解决方法就是每次在获取新的(注意是新的,原有的连接也无妨,但影响效率)数据库连接时,首先执行设置连接的锁等待时间的Sql:

SET LOCK MODE TO WAIT 10 (意思是设置锁等待时间为10ms),

这样基本解决问题,不再出现异常情况。

Oracle:

在Informix环境下开发的项目系统,割接到Oracle应用系统的时候,经过一段时间运行,出现 "ORA-01000: maximum open cursors exceeded" 的错误,表示 cursors 已经用完,无法继续数据库操作,主要原因是由于在一个进程打开的游标数超过设定值。

查询资料后发现,单纯增大cursors值并不是彻底解决的方法,主要还是在于应用系统的代码问题,大都因为在循环内使用了preparedStatement或createStatement,每执行一条创建意味着在Oracle中增加使用一个Cursor。

解决方法:executeQuery、executeUpdate等操作后立即释放资源,或把创建statement或preparedStatement的方法移出循环,避免不必要的Cursor使用情况,这样做带来的操作效率可以提高至少10倍,在preparedStatement时更是如此。

DB2:

程序运行时,报出连接数超过最大限制!

初一看,以为DB2的版本不对口所以有限制,可怎么的也是Enterprise版啊,于是翻箱倒柜,找到主要还是数据库的配置参数设置问题。 默认DB2的应用程序连接数设置都不高,需要根据应用手工自行调整,在控制中心-数据库-选择相应数据库-右键,选择配置-应用程序-最大活动应用程序数,注释为:指定可同时连接到数据库的最大(本地和远程)应用程序数(1-5000),

更改加大同时连接数据库的参数值即可。

 informix临时表的存放位置
根据informix的语法手册,create temp table或者select ... into temp语句,会显式创建临时表,如果在语句中没有包含存放位置子句的话,临时表的存放位置应该放在环境变量DBSPACETEMP或者ONCONFIG 参数DBSPACETEMP所指定的Dbspace中。

但是在实践中,发现事实并非如此,如果create temp table没有带with no log子句,那么该临时表不会放到DBSPACETEMP所指定的Dbspace,而是放到informix的系统Dbspace——rootdbs。

经过查询资料,终于弄明白原因所在。

通常用户创建的Dbspaces(相当于oracle中的tablespace)都是带日志功能的,但临时类型Dbspace(创建时指定Temp标志为Y)例外,是不带日志功能的。

创建临时表时,如果没有指定with no log子句,那么informix就会根据表所在数据库的日志模式,来设定表的日志模式。大多数情况下,我们用户为了保证数据可靠性,都会开放数据库日志模式。于是,informix只能选择那些带日志功能的Dbspaces来存放临时表,而不幸的是,管理员总是把一些临时类型Dbspace列在 DBSPACETEMP变量中。这就出现——虽然指定DBSPACETEMP,但informix仍然把临时表放在rootdbs的问题。

解决方法就是在DBSPACETEMP变量中,添加一些非临时类型的Dbspace(临时和非临时Dbspaces可以共存)。

另:DBSPACETEMP变量应该还要放一些临时类型的Dbspace,用于那些非显式生成临时表的情况,例如:大表join,排序等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值