TimesTen也支持临时表的,只是可能不是很常用,往往被大家忽视,而且临时表本身来说也有很多的限制,所以也只是在一些非常特别的场合才会使用它。 

    临时表不象普通的表,它里面的数据不是永久存在的,或者说有一定的时效限制的。目前TimesTen支持的是全局性的临时表。全局性临时表的定义是永久的,即你必须通过显式地方式定义它,就和定义普通的表一样,这个表会一直存在的,除非你drop掉它。且全局性的临时表对所有的连接是可见的,即所有连接到该DataStore的连接,都可以看到该表的存在。但是每个连接能访问到的数据就有区别。也就是说,临时表对其中的数据有些额外的标识,比如说 Connection ID等,一般这些数据在连接需要时创建,在连接退出时删除。 

    临时表的存储也和普通表不一样,它是存放在Temp 空间中的,而不是和普通的表一样放在Perm空间中,所以如果临时表中放的数据比较庞大的话,需要设置比较大的Temp空间。 

    由于临时表的数据是和每个连接绑定的,所以虽然多个连接可以访问同一个临时表中的它自己的数据,但不能和其它的连接共享。而且每个连接针对临时表的编译好的SQL语句,也是不能在连接之间共享的。因为它里面已经通过Connection ID做了区分。 

另外,对临时表也有很多的限制: 

  • 临时表不能用在Cache Group 或者 Replication 中。当我们Replication整个DataStore的时候,比如说Active-Standby Pair,临时表会被自动地剔除在Replication之外。 
  • Cache Group中的表不能被定义为临时表。 
  • 针对临时表的数据更新不能被XLA跟踪。也就是说XLA在临时表上无效。 
  • 不能 Truncate 临时表,即Truncate操作对临时表是无效的。 
  • 不支持 ‘As Select’ 语法
  • 不支持Alter Table 语法
  • 不能在物化视图的定义中引用临时表
  • 不能在临时表上使用Aging机制
  • 当其它连接有数据在临时表上时,不能创建索引

    很多时候,我们使用临时表,一个是因为有些数据只是暂时使用一样,没必要永久保存。另一个重要的原因是,针对临时表的操作只是产生很少量的日志。但是它确实是有少量日志的,只是相比普通的表,日志很少而已。

    全局临时表的语法如下:

CREATE GLOBAL TEMPORARY TABLE [Owner.]TableName
(
     {{ColumnDefinition} [,...]
      [PRIMARY KEY (ColumnName [,...]) |
      [[CONSTRAINT ForeignKeyName]
          FOREIGN KEY ([ColumnName] [,...])
          REFERENCES RefTableName
                [(ColumnName [,...])] [ON DELETE CASCADE]] [...]
     }
)
[UNIQUE HASH ON (HashColumnName [,...])
        PAGES = PrimaryPages]
[ON COMMIT { DELETE | PRESERVE } ROWS ]

    语法上比较特别的地方是最后一个选项 [ON COMMIT { DELETE | PRESERVE } ROWS ],它的意思是当目前的连接提交事务的时候,如何处理临时表中的数据,是删除(Delete)呢?还是保留(Preserve)呢?下面是示例:

 
[tt705@west-mountain info]$ ttisql tttemptable
Copyright (c) 1996-2008, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.
All commands must end with a semicolon character.
 
connect "DSN=tttemptable";
Connection successful: DSN=tttemptable;……
(Default setting AutoCommit=1)
Command> CREATE  global TEMPORARY TABLE tt(a int) on commit delete rows;
Command> autocommit off;
Command> insert into tt values ( 1);
1 row inserted.
Command> select * from tt;
< 1 >
1 row found.
Command> commit;
Command> select * from tt;
0 rows found.
Command> drop table tt;
Command> CREATE  global TEMPORARY TABLE tt(a int) on commit preserve rows;
Command> autocommit off;
Command> insert into tt values ( 1);
1 row inserted.
Command> select * from tt;
< 1 >
1 row found.
Command> commit;
Command> select * from tt;
< 1 >
1 row found.
Command>
 

    在这其中,如果你另起一个连接到 tttemptable,是不会看到别人正在操作的任何数据的。

留言