南大通用GBase8s 常用SQL语句(八十九)
LOCK MODE 选项
使用 LOCK MODE 选项指定该表的锁定粒度。
LOCK MODE 选项
下表描述了锁定粒度的可用选项。
粒度 |
作用 |
PAGE |
在一整页的行上获取并释放一个锁 这是缺省的锁定粒度。当您知道行分组到各页所依照的顺序与您正在用来处理所有行的顺序相同时,页级别锁定就特别有用。例如,如果您正在按照表的集群索引的顺序来处理表的内容时,页锁定将十分使用。 |
ROW |
在每一行上获取并释放一个锁 行级别锁定提供*别的并发性。如果同时使用许多行,则锁定管理开销将变的十分可观。根据您的数据库服务器的配置,也可以超出可用锁的最大数目。但是 GBase 8s 在 32 为平台上可支持 180 万个锁,或者在 64 位平台上支持 6000 万个锁。只有行级别锁定的表才支持 LAST COMMITTED 隔离级别功能。 |
接着可用使用 ALTER TABLE ... LOCK MODE 语句更改表的锁定方式。
优先顺序和缺省行为
在 GBase 8s 中,您不需要每次创建新表时都指定锁定方式。您可以在以下环境中,全局地设定所有新表的锁定粒度:
- 单用户的数据库会话
可以在当前会话期间,把 IFX_DEF_TABLE_LOCKMODE 环境变量设置为指定新表的锁定方式。
- 数据库服务器(数据库服务器上的所有会话)
如果您是一个 DBA ,则可以设置 ONCONFIG 文件中的 DEF_TABLE_LOCKMODE 配置参数,以缺省数据库服务器中所有新表的锁定方式。
如果您不是 DBA,可以在运行 oninit 之前,设置数据库服务器的 IFX_DEF_TABLE_LOCKMODE 环境变量用来指定数据库服务器中所有新表的锁定方式。
CREATE TABLE 语句中的 LOCK MODE 设置优先于 IFX_DEF_TABLE_LOCKMODE 环境变量和 DEF_TABLE_LOCKMODE 配置参数。
如果 CREATE TABLE 未设置锁定方式,则缺省方式将取决于 IFX_DEF_TABLE_LOCKMODE 环境变量或 DEF_TABLE_LOCKMODE 配置参数的设置。有关 IFX_DEF_TABLE_LOCKMODE 的信息,请参阅 GBase 8s SQL 参考指南。有关 DEF_TABLE_LOCKMODE 配置参数的信息,请参阅 GBase 8s 管理员参考手册。
AS SELECT 子句
使用 CREATE TABLE 语句的 AS SELECT 子句创建新的表并插入指定查询的结果集的数据行。
此语法在功能上与 SELECT 语句的 INTO STANDARD 和 INTO RAW 子句 非常相似。
当您使用 AS SELECT 子句创建新的查询结果表,并使用指定查询返回的限定行填充该表时,只有 CREATE TABLE 语句语法的以下的子集才有效:
元素 |
描述 |
限制 |
语法 |
column |
查询的 FROM 子句中的表的列。这将是结果表中的列名。 |
必须在查询结果集中存在 |
标识符 |
column_alias |
列的别名或显示标签。声明结果表中的列名称。 |
查询的 Projection 子句中的任何非平凡表达式在结果表中需要其列名的别名或显示标签 |
标识符 |
table |
此处为结果表声明的名称 |
在数据库中表、同义词、视图和序列名称中必须是唯一的。 |
标识符 |
target_data_type |
显式强制转型返回的数据类型。它将会是结果表中列的数据类型。 |
请参阅 对于目标数据类型的规则 |
数据类型 |
用法
当使用 CREATE TABLE . . . AS SELECT 语句创建新的永久表来存储查询的结果时,您可以指定该表的日志记录方式为 STANDARD 或 RAW 。如果您都忽略了这些关键字,则缺省为 STANDARD 。
您还可以可选地为此查询结果表指定下列属性:
- 独立存储位置,或者分布存储方案e
- 它的第一个 extent 和下一个 extent 的存储大小
- 它的 PAGE 或 ROW 锁定粒度
如果您省略了存储或锁定规范,则数据库服务器使用缺省值。
如果在数据库服务器向该表填充大量 AS SELECT 子句中查询返回的行时发生了错误,则该操作会回滚,且不会创建或填充新表。
出现在 AS SELECT 子句的 Projection 列表中的列可以来自任何本地表、视图或来自远程数据库(必须在限定的表名中引用),但是新表必须在本地数据库中创建。
在 grid 环境中,如果 AS SELECT 子句的 FROM 子句中的表与所有参与的指定的 grid 或地区的数据库服务器具有相同的结构,则您可以包含 AS SELECT 子句以从grid 查询创建表。
结果表中列的名称
缺省情况下,新永久表中的列名称是在 Projection 子句的 SELECT 列表中指定的名称。如果星号(*)是 Projection 子句的 SELECT 列表,则星号将扩展为 SELECT 语句的 FROM 子句中对应的表或视图中的所有列名。由 FROM 子句指定表对象中的任何显式或隐式影子列不会由星号规范扩展。
在实现 Enterprise Replication 的系统上,可以使用 ALTER TABLE 语句的 ADD CRCOLS 、ADD REPLCHECK 和 ADD ERKEY 选项将相应的影子列添加到 AS SELECT 子句创建的结果表中。
除了简单列表达式之外, Projection 子句的 SELECT 列表中所有表达式都必须具有显示标签(也称为 列别名)。这用作新查询结果表中相应列的标识符。如果列表达式没有显示标签,则结果表使用查询的 FROM 子句中的源表中的列名。
在 CREATE TABLE . . . AS SELECT 语句中,可以使用以下两种方法指定列别名:
- 作为逗号分隔的别名列表,紧跟在 TABLE 关键字后面,类似于 INSERT INTO . . . SELECT FROM 语句
- 作为 Projection 子句中 SELECT 列表的一部分,与结构表中的 SELECT . . . INTO STANDARD 或 SELECT . . . INTO RAW 语句可以创建
如果在 CREATE TABLE . . . AS SELECT 语句中存在 Projection 子句的 SELECT 列表和 TABLE 关键字后面的逗号分隔的别名列表,则列别名的逗号分隔列表优先。在这种情况下,将忽略在 AS SELECT 子句中声明的任何列别名。
在以下情况中 CREATE TABLE . . . AS SELECT 语句会发生错误并失败:
- I如果未为非重要列表达式声明显示标签或列别名。
- 如果显示标签或列名称与新结果表中的另一列具有相同的名称。
- 除了存储选项和 LOCK MODE 属性之外,CREATE TABLE . . . AS SELECT 语句不能为新表的列定义约束或任何其它特殊属性。
- 如果逗号分隔的别名列表位于 TABLE 关键字之后,但该列表的别名数量少于 Projection 子句的 SELECT 列表中的表达式数量。
但是,如果 TABLE 关键字后面的列别名列表具有比 Projection 子句的 SELECT 列表更多的项目,在这种情况下,数据库服务器将忽略过多的列别名,并且不会发生异常。