首页 > 数据库 > 数据库开发技术 > Informix临时表
http://www-900.ibm.com/cn/support/faqhtmlfaq/2697869G31003.htm
在 Informix 数据库中,我们经常会创建一些临时表来处理应用中的临时信息。系统可以采用如下两种方式创建临时表:
使用 SELECT INTO TEMP 语句隐含地创建临时表
使用 CREATE TEMP TABLE 语句显示地创建临时表
如果数据库采用非日志模式,DBSPACETEMP 环境变量或配置参数设置后,临时表会自动创建在由 DBSPACETEMP 环境变量或配置参数指定的数据空间上;如果数据库采用日志模式,那么创建的临时表缺省情况下是记日志的,不会被创建在由 DBSPACETEMP 环境变量或配置参数指定的数据空间上,那么由 SELECT ... INTO TEMP 语句创建的临时表将被创建在根数据空间(Root dbspace)上,由 CREATE TEMP TABLE 语句创建的临时表将被创建在数据库所在的数据空间上。如果希望临时表创建在由 DBSPACETEMP 环境变量或配置参数指定的数据空间上,我们需要使用 SELECT INTO TEMP with no log 语句或 CREATE TEMP TABLE with no log 语句来创建临时表。
下边例子显示了在日志模式数据库中创建临时表的方法:
$ export DBSPACETEMP=dbs1,dbs2
SELECT number FROM account INTO TEMP tp1
Use with a logged database:
Temp table tp1 is created in the rootdbs:
SELECT number FROM account INTO TEMP tp2 WITH NO LOG
Temp table tp2 is fragmented across dbs1,dbs2:
临时表按照如下优先顺序创建在相应的数据空间上:
由 DBSPACETEMP 环境变量指定的数据空间
由 DBSPACETEMP 配置参数指定的数据空间
如果设置了 DBSPACETEMP 环境变量,那么临时表会创建在由 DBSPACETEMP 环境变量指定的数据空间上,如果没有设置 DBSPACETEMP 环境变量,那么临时表会创建在由 DBSPACETEMPP 配置参数指定的数据空间上。
出于性能考虑,一般我们建议在多个物理磁盘上创建多个临时表空间,这样,当创建临时表时,它会分片到所有临时表空间上,提高并发处理效率。
在采用日志模式的数据库中,对临时表的所有 DML 操作都要记日志,而且不加 with no log 选项,临时表不会创建在由 DBSPACETEMP 环境变量或配置参数指定的临时数据空间上,往往数据会写到根数据空间(Root dbspace)上,影响系统性能,而且用户在创建临时表时,往往总是忘记 with no log 选项。为了解决上述问题,Informix 11 版本开始提供了关闭对临时表记日志的方法,这样,建临时表时,即使没加 with no log 选项,临时表也会创建在由 DBSPACETEMP 环境变量或配置参数指定的临时数据空间上。
我们可以采用下述两种方法来关闭对临时表记日志:
修改 onconfig 配置参数
TEMPTAB_NOLOG 1
通过 onmode 命令动态改变
onmode -Wf "TEMPTAB_NOLOG =1"
onmode -Wm "TEMPTAB_NOLOG =1"
其中,-Wm 选项改变参数值后立即生效; -Wf 选项改变参数值后立即生效,同时将新的参数值写到 onconfig 配置文件中。
使用 TEMPTAB_NOLOG 参数来禁用临时表上的日志记录。该参数可以改进应用程序的性能,尤其是在有 HDR 辅助服务器、RS 辅助服务器或 SD 辅助服务器的数据复制环境中,因为其防止 Informix 通过网络传输临时表。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22565551/viewspace-1027544/ ,如需转载,请注明出处,否则将追究法律责任。