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

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: DB2/Informix

2008-03-20 21:15:20

 
根据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,排序等等。
阅读(469) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~