使用 WITH NO LOG 选项
使用 WITH NO LOG 选项减少临时表的事务日志记录的开销。如果您指定 WITH NO LOG,在临时表上的数据操纵语言(DML)操作将不包含在事务日志记录中。
您在临时数据库中创建的所有的临时表都需要 WITH NO LOG 关键字。在一个集群环境中,当您在辅助服务器上创建临时表时需要 WITH NO LOG 关键字。
如果 ONCONFIG 参数 TEMPTAB_NOLOG 设置成 1 ,则临时表的日志记录被禁用,且所有的临时表都缺省为非日志记录的。 该项设置可以提高使用临时表的操作(例如,HDR 操作)的性能。当 TEMPTAB_NOLOG 设置禁用临时表的日志记录时,不需要 WITH NO LOG选项。有关如何设置 TEMPTAB_NOLOG 参数的更多信息,请参阅 GBase 8s 管理员参考手册。
如果在不使用日志记录的数据库中使用 WITH NO LOG 选项,则 CREATE TEMP TABLE 语句的 WITH NO LOG 关键字不会生效。如果您的数据库不支持事务日志记录,所有的表的行为都将表现为已经指定了 WITH NO LOG 选项。
ALTER TABLE 语句不能更改临时表的日志记录的状态。一旦您关闭了临时表上的日志记录,则将无法再打开它;因此,临时表是始终记录日志的或从不记录日志的。
以下临时表在使用日志记录的数据库中不记录日志:
CREATE TEMP TABLE tab2 (fname CHAR(15), lname CHAR(15))
WITH NO LOG;
类似于所有的数据定义语句(DDL)以上 CREATE TEMP TABLE 语句创建 tab2 是日志记录的。但是,WITH NO LOG 关键字将阻止任何 tab2 上的 DELETE 、INSERT 、LOAD 、MERGE 、SELECT 、UNLOAD 或 UPDATE 操作的事务日志记录。
临时表的存储选项
使用 CREATE TEMP TABLE 语句的存储选项指定表的存储位置和分布方案。它是 SQL ANSI/ISO 标准的扩展。
存储选项
元素 | 描述 | 限制 | 语法 |
dbspace | 存储临时表的 Dbspace 或临时 dbspace | 必须已经存在 | 标识符 |
extspace | onspaces 被指定给数据库服务器以外的存储区域的名称 | 必须已经存在 | 请参阅文档以了解您使用的存取方法。 |
只有包含 BLOB 或 CLOB 列的临时表可以包含 PUT 子句作为存储选项。
如果您在 IN 关键字之后指定一个临时 dbspace ,则数据库服务器不会执行任何该临时表的逻辑日志记录或物理日志记录。您无法镜像一个临时 dbspace。
如果您没有指定 extent 大小选项,则缺省的 extent 大小是 8 页面。
要在临时表上创建一个分片的、唯一的索引,您必须在 CREATE TEMP TABLE 语句中为此临时表指定一个显式的基于表达式的分布方案。(不支持通过 ROUND ROBIN 分片索引,对使用 LIST 或 INTERVAL 存储分区策略的表上的唯一索引,自动通过 LIST 或 INTERVAL 分片。)
临时表的存储位置
通过 CREATE TEMP TABLE 语句指定的分布方案(可以使用 IN 子句或 FRAGMENT BY 子句)优先于 DBSPACETEMP 环境变量或 DBSPACETEMP 配置参数指定的信息。
对于您没有指定显式分布方案的临时表,它的存储位置取决于 DBSPACETEMP 环境变量(或 DBSPACETEMP 配置参数)的设置。
- 如果没有设置 DBSPACETEMP 和 DBSPACETEMP ,则所有在建立的数据库(或者 rootdbs ,如果数据库服务器不在另一个 dbspace 中建立)的同一 dbspace 中创建的临时表都不会有分片。
- 如果临时表只有一个 dbspace 是通过 DBSPACETEMP 指定(或通过 DBSPACETEMP ,如果没有设置 DBSPACETEMP ),则将在指定的 dbspace 中创建所有的临时表而不分片。
- 如果 DBSPACETEMP (或者 DBSPACETEMP ,如果 DBSPACETEMP 没有设置)为临时表指定了两个或多个dbspace ,则每个临时表将在指定的其中一个 dbspace 中创建。
在不日志记录的数据库中,每个临时表都创建于一个临时的 dbspace 中;在支持事务日志记录的数据库中,临时表创建于标准 dbspace 中。数据库服务器跟踪哪个 dbspace 最近被使用,并且当它接收到下一个要分配临时存储的请求时,数据库服务器使用下一个可用的 dbspace (以循环的方式)在 dbspace 之间平均分配 I/O 操作。
例如,如果您在日志记录的数据库中创建了三个临时表,DBSPACETEMP 指定 tempspc1 、tempspc2 和 tempspc3 作为该临时表的缺省 dbspace ,第一个在名为 tempspc1 的dbspace 中,第二个在 tempspc2 中,第三个在 tempspc3 中(如果这些是临时存储的唯一请求)。
使用 SELECT INTO TEMP 和 WITH NO LOG 创建的临时分片将 DBSPACETEMP 配置参数或 DBSPACETEMP 环境变量列出的 dbspace 之间传播。因此,指定多个 dbspace 的 DBSPACETEMP (或者 DBSPACETEMP)设置可生成跨临时 dbspace 中所有 dbspace 循环分片。
如您创建了临时表并指定 WITH NO LOG ,则临时表上的操作将不会包含在事务日志记录中。如果 DBSPACETEMP 列表中有一个日志记录的空间,则使用 SELECT .. INTO TEMP WITH NO LOG 选项创建的临时表将在非日志记录的临时 dbspace 中通过循环分布方案分片。例如,如果来自 10 个 dbspace 的列表,只有一个 dbspace 是日志记录,则该表在其它 9 个非日志记录的临时 dbspace 中按照循环分布方案分片。
以下示例显示如果将数据插入到名为 result_tmp 的临时表中,并将用户定义的能返回多行的函数(f_one)的结构输出到文件中:
CREATE TEMP TABLE result_tmp( ... );
INSERT INTO result_tmp EXECUTE FUNCTION f_one();
UNLOAD TO 'file' SELECT * FROM result_tmp;
临时表和永久表之间的差异
与永久表相比,临时表在以下方面不同:
- 可用的约束类型更少。
- 您可以指定的选项更少。
- 它们对于其它用户或会话不可见。
- 不出现在系统目录中。
- 不能保存它们,如临时表的持续时间中所述。
DB-Access 的 INFO 语句和 Info Menu 选项无法引用临时表。
临时表的持续时间
临时表的持续时间取决于它是否进行日志记录。
进行日志记录的临时表将一直存在,直到以下情况发生:
- 应用程序断开连接。
- 对临时表发出 DROP TABLE 语句。
- 数据库已关闭。
当这些事件中的任意一件发生时,将删除临时表。
非日志记录的临时表包含那些用 CREATE TEMP TABLE 的 WITH NO LOG 选项创建的表。
非日志记录的临时表将一直存在,直到以下情况发生:
- 应用程序断开连接。
- 对临时表发出 DROP TABLE 语句。
- 数据库已关闭,且非日志记录的临时表包含至少一个用户定义类型的列,或者一个内置的透明数据类型( GBase 8s 内置的透明数据类型包括 BLOB, BOOLEAN 、CLOB 、LVARCHAR 和 IDSSECURITYLABEL。)
如果非日志记录的临时表不包含任何 UDT 或内置的透明数据类型的列,则当应用程序仍保留连接时,您可以使用此表将数据从一个数据库传输到另一个数据库,因为当数据库已关闭时该表并未销毁。如果要传输的数据包含 UDT 或内置透明数据类型,则您必须使用永久表(或者一些其它策略)。