本文描述Informix临时表的概念、SQL、临时表空间、约束、新特性以及优化建议。目的旨在说明如何在我们的应用开发中合理的使用和管理Informix临时表。
在Informix数据库中,我们可以创建临时表来处理应用中的临时数据,并且临时表数据存储在临时表空间中。Informix系统不记录临时表的字典信息,从数据库系统表中查询不到临时表的如何相关信息。可以在临时表上创建索引。临时表的作用域为session,当session结束(应用程序断开数据库)、数据库实例关闭或者系统异常关闭后重新启动时临时表由数据库系统自动进行删除。因此,我们需要正确利用Informix临时表这些特点来解决我们数据库应用系统中的各种业务问题。
可以采用如下两种方式创建临时表:
A、使用 SELECT INTO TEMP 语句隐含地创建临时表;
B、使用 CREATE TEMP TABLE 语句显示地创建临时表;
显示的创建临时表的语法描述如下:
注意事项:
n 命名规则:临时表只作用于一个session中,而不在整个数据库中。在一个session创建临时表时应该遵守如下规则:
A、 临时表明必须不同于当前数据库中其他table,view,sequence和synonym的名称;
B、 可以与其他session中的临时表名称相同;
C、 在同一session中,不能创建相同名称的临时表,可以先删除后再创建。
n WITH NO LOG:在日志数据库中,定义该选项后,对该临时表的操作不记录事务日志。
示例说明:如下示例说明临时表的使用语法。
DataBase:demodb buffed log |
|
数据库demodb存在如下表:tab1 create table tab1(c1 integer); |
|
Session 1: |
Session 2: |
在如下几种情形下,数据库服务器将自动创建临时表。
n 使用GROUP BY 和 ORDER BY 子句;
n 包含聚集函数,并且使用了UNIQUE或者DISTINCT;
n 执行计划使用HASH JOIN的表关联;
n 复杂的CREATE VIEW;
n 创建scroll cursor;
n 关联子查询;
n 应用IN或者ANY子句的子查询;
n 创建INDEX;
如果数据库采用非日志模式,DBSPACETEMP 环境变量或配置参数设置后,临时表会自动创建在由 DBSPACETEMP 环境变量或配置参数指定的数据空间上;如果数据库采用日志模式,那么创建的临时表缺省情况下是记日志的,不会被创建在由 DBSPACETEMP 环境变量或配置参数指定的数据空间上,那么由SELECT ... INTO TEMP语句创建的临时表将被创建在根数据空间(root dbspace)上,由CREATE TEMP TABLE语句创建的临时表将被创建在数据库所在的数据空间上。如果希望临时表创建在由 DBSPACETEMP 环境变量或配置参数指定的数据空间上,我们需要使用 SELECT INTO TEMP with no log 语句或 CREATE TEMP TABLE with no log 语句来创建临时表。
下面的表格详细说明了临时表的数据存储位置的各种情况:
Case A: select * from tab1 into temp tmp1 或者
create temp table tmp1(c1 int);
Case B: select * from tab1 into temp tmp1 with no log; 或者
create temp table tmp1(c1 int) with no log;
数据库demodb创建在dbs1上 |
|||||||
DBSPACETEMP 设置为tmpdbs |
DBSPACETEMP不设定 |
||||||
DB with LOG |
DB No-Log |
DB with LOG |
DB No-Log |
||||
A |
B |
A |
B |
A |
B |
A |
B |
rootdbs dbs1 |
tmpdbs |
tmpdbs |
tmpdbs |
dbs1 |
dbs1 |
dbs1 |
dbs1 |
表格浅绿色部分情况是日志数据库中为了考虑性能所期望的一种临时表存储方式:日志数据库设定DBSPACETEMP参数为tmpdbs,我们在创建临时表时加上with no log选项,临时表将会将数据存储在临时表空间tmpdbs上。
另外,正如smart large objects需要SBSPACEDBS一样,也需要为大对象临时表设置相应的临时存储数据空间SBSPACETEMP。为了性能考虑,我们一般都要配置多个SBSPACETEMP数据空间。
从上面的描述,我们可以得知不管是由用户创建的临时表,还是由系统自动创建的临时表都需要进行存储,用户创建的临时表某些情况下还需要记录日志。出于性能考虑,我们从如下两个方面提高临时表的性能。
1. 取消日志
在日志数据库中,通过with no log选项,取消临时表的DML操作的日志,这样能大大提高数据处理效率。另外,尤其是在有 HDR 辅助服务器、RS 辅助服务器或 SD 辅助服务器的数据复制环境中,因为其防止 Informix 通过网络传输临时表。
2. 利用临时表空间
通过如下原则利用临时表空间提高临时表的性能:
n 创建独立的临时表空间,防止与root dbspace及默认表空间的I/O争用情况;
n 创建多个临时表空间,并正确配置DBSPACETEMP参数;
n 为临时表空间分配足够大的存储空间,防止出现临时表空间不足的情况;
n 大数据临时表以round-robin模式分布在多个临时表空间上。并且设置PDQ priority>0,可以提高临时表数据并发处理效率;
n 根据临时表存储表空间使用原则,使用with no log选项;
n 临时表空间不能使用direct I/O,所以你需要分配足够的AIO VPs
在采用日志模式的数据库中,对无with no log选项的临时表的所有DML操作都要记日志。当不加 with no log 选项时,临时表不会创建在由DBSPACETEMP环境变量或配置参数指定的临时数据空间上,往往将数据写到rootdbs或者默认数据库空间上,大大影响了系统性能。而且用户在创建临时表时,有时会忘记 with no log 选项。为了解决上述问题,IDS 11 版本开始提供了关闭对临时表记日志的TEMPTAB_NOLOG参数,建临时表时,即使没加 with no log 选项,临时表也会创建在由 DBSPACETEMP 环境变量或配置参数指定的临时数据空间上。
我们可以采用下述两种方法来关闭对临时表记日志:
方法一: 修改onconfig配置参数 TEMPTAB_NOLOG 1
|
|
方法二:onmode命令动态修改 onmode -Wf TEMPTAB_NOLOG=1 或者 onmode -Wm TEMPTAB_NOLOG=1 -Wm 选项改变参数值后立即生效; -Wf 选项改变参数值后立即生效,同时将新的参数值写到 onconfig 配置文件中 |
以下为Informix临时表、临时表空间的几点约束:
n 在数据库服务器重启时,临时表空间将被清空;
n 临时表不能进行备份、恢复;
n 临时表空间不能使用direct I/O,所以你需要分配足够的AIO VPs;
n 临时表的列上不能创建外关联约束;