GRID 子句
使用 GRID 子句来指定跨服务器查询的作用域,该查询的数据源是作为 GBase 8s 网格的节点的数据库服务器的表。
除非会话连接到现有的网格之内的数据库,GRID 子句才是有效的。可通过使用 Enterprise Replication 设施的适当的 cdr 命令和 ifx_grid 例程创建网格。
此语法是对 SQL 的 ANSI/ISO 标准的扩展。
SELECT 语句的 GRID 子句支持下列语法:
GRID 子句

元素 | 描述 | 限制 | 语法 |
grid | 此查询所在作用域之内的网格的名称 | 必须存在,且必须通过 cdr define grid 命令定义 | 标识符 |
region | 此查询所在作用域中的区域的名称 | 必须存在且必须通过 cdr define region 命令定义 | 标识符 |
用法
任何显式地或隐式地包括 GRID 子句的 SELECT 语句都称为网格查询。网格查询的结果,是来自在每个网格服务器中的带有相同名称和相同模式的跨表的 FROM 子句中的每一表的逻辑 UNION 或 UNION ALL 的符合条件的行。此联合可包括该网格中跨所有节点的表,或跨这些网格节点的子集,称为区域。
注: 网格查询的 FROM 子句指定的表必须都有相同的模式,且必须满足此主题标识的其他要求。由于这些限制,所以不是所有的 GBase 8s 网格都可支持网格查询。
可选的 ALL 关键字
如果可选的 ALL 关键字紧跟在 GRID 关键字之后,则网格查询的结果是逻辑的 UNION ALL,意味着该网格查询的结果集可包括重复的行。否则,如果您省略 ALL 关键字,则仅从每一参与的服务器的结果的逻辑 UNION 返回 distinct 值。
网格查询的 SET ENVIRONMENT 语句选项
对 SET ENVIRONMENT 语句的两个选项可定义缺省的 GRID 子句,以便于任何不带有 GRID 子句的后续的 SELECT 语句被解释为包括该缺省的 GRID 子句的网格查询:
SET ENVIRONMENT SELECT_GRID
此语句可指定网格或区域作为后续的网格查询的缺省的作用域,这些网格查询返回唯一的符合条件的行的联合。GRID 子句可省略网格查询的网格或区域名称,为指定的缺省节点返回 UNION 结果。
SET ENVIRONMENT SELECT_GRID_ALL
此语句可指定网格或区域作为后续的网格查询的缺省的作用域,这些网格查询返回所有符合条件的行的联合,包括重复的行。GRID 子句可省略网格查询的网格或区域名称,为指定的缺省节点返回 UNION ALL 结果。
在启用 SET ENVIRONMENT 语句的这些选项之一时,SQL 解析器将当前的缺省 GRID 子句应用到不包括显式的 GRID 子句的会话中的每个 SELECT 语句。在同一时间上的同一会话期间,只有一个缺省的 GRID 子句可起作用。当使用 SET ENVIRONMENT 语句来设置其他关键字选项使选项生效时,或当为不同的网格或区域重置同一关键字选项时,会禁用先前设置的缺省值。
您还可通过发出这些 SQL 语句之一来禁用缺省的 GRID 子句:
SET ENVIRONMENT SELECT_GRID DEFAULT;_
SET ENVIRONMENT SELECT_GRID_ALL DEFAULT;
上述每一语句都阻止数据库服务器将当前的会话中的每个后续的查询都解释为网格查询。除非您在同一会话中定义新的缺省的 GRID 子句,否则,任何后续的 SELECT 语句必须包括显式的 GRID 子句来作为网格查询运行。
在 UNION 查询的 SELECT_GRID 会话环境选项或 UNION ALL 查询的 SELECT_GRID_ALL 会话环境选项已指定了缺省的网格或区域作为当前会话中的网格查询的作用域时, 您可省略那个网格或区域所在节点上的网格查询中的 GRID 子句,如下例所示。在此,tab1 和 tab2 是在网格的 region_03 子集之内的每个网格服务器上的有相同的模式、语言环境和代码集的表:
SET ENVIRONMENT SELECT_GRID 'region_03'
SELECT * FROM tab1;
SELECT * FROM tab2;
执行上述两个查询,就如同您已显式地指定了此 GRID 子句:
SELECT * FROM tab1 GRID 'region_03';
SELECT * FROM tab2 GRID 'region_03';
在同一时点,对于当前的用户会话,对于 SET ENVIRONMENT 语句仅可启用一个 SELECT_GRID 和 SELECT_GRID_ALL 会话环境选项。当其中一个选项生效时,使用 SET ENVIRONMENT 语句来设置其他的关键字选项,或重置不同的网格或区域的同一关键字选项,可禁用先前设置的缺省值。
下列 SQL 语句通过定义不同的缺省的 GRID 子句,组合来自不同区域中的参与的网格服务器的 UNION ALL 结果,将先前的缺省的 GRID 子句替换为网格的 region_04 子集:
SET ENVIRONMENT SELECT_GRID_ALL 'region_04'
SELECT * FROM tab1;
SELECT * FROM tab2;
将会执行那两个查询,就如同您已制定了此 GRID 子句:
SELECT * FROM tab1 GRID ALL 'region_04';
SELECT * FROM tab2 GRID ALL 'region_04';
在缺省情况下,如果发出网格查询的数据库服务器不可连接到网格或区域之内的一个或多个节点,显式的或缺省的 GRID 子句指定该网格或区域,则网格查询失败。即使指定的网格或区域中的有些网格服务器不可用,SET ENVIRONMENT 语句仍可启用的另一会话环境变量可从网格查询返回部分的结果:
SET ENVIRONMENT GRID_NODE_SKIP
当一个或多个网格服务器不可用时,此语句可使得网格查询的处理得以继续。
如果您发出 SQL 语句
SET ENVIRONMENT GRID_NODE_SKIP ON;
,则数据库服务器不论任何不可用的节点,并从参与的网格服务器返回符合条件的行。您可通过调用 ifx_gridquery_skipped_nodes() 函数来表示任何跳过的节点。
另一函数,ifx_gridquery_skipped_node_count(),可用于检测跳过了多少个节点。要获取更多关于这些函数的信息,请参阅 GBase 8s Enterprise Replication 指南。
在网格查询的 FROM 子句中的表
在网格查询的 FROM 子句中,仅永久数据库表是有效的。必须通过运行 cdr change gridtable 命令来将它们定义为网格表。
不支持下列表对象:
l 表上的同义词或视图,除了 sysmaster 数据库中的表之外
l CREATE EXTERNAL TABLE 语句定义的表对象
l 由数据库服务器或网格服务器的名称限定的表
l 正在其上执行并发的 ALTER TABLE、ALTER FRAGMENT 或 ALTER INDEX 操作的表
l 与参与的网格服务器的数据库中同一名字的其他表有不同的模式的表
l 不是以相同的数据库语言环境和代码集创建的数据库中的表
l 跨参与该网格查询的所有数据库,其 SQL_LOGICAL_CHAR 配置参数或 DELIMIDENT 或 GL_USEGLU 环境变量的设置不相同的数据库中的表。
此外,网格查询的 projection 列表不可包括在跨服务器查询中其数据类型不被支持的任何列或表达式。不被支持的数据类型包括所有复合的或大对象类型,以及一些用户定义的类型(UDT)和 opaque 类型。
适用于同一 GBase 8s 示例的跨数据库的分布式 DML 操作中的 DISTINCT 数据类型的相同限制,也适用于网格查询中的 DISTINCT 数据类型。要获取在分布式查询中有效的数据类型的讨论,请参阅主题 跨服务器事务中的数据类型 and 分布式操作中的 DISTINCT 类型。
对网格查询的附加的限制
执行网格查询的用户必须是该网格或区域之内所有节点上的有效用户。
网格查询不可为包含对其外查询引用的子查询。
在其规范之中,网格查询不可引用的任何下列之一:
l 子查询(但网格查询自身可为其不引用的外查询的子查询)
l 跨网格服务器的连接操作
l 导致跨服务器连接的连接请求
l 在所有参与的网格服务器上都不存在的过程或函数。
在网格查询块中,UNION 或 UNION ALL 集合运算符都不是有效的,INTERSECT、MINUS 或 EXCEPT 集合运算符也都不是有效的。
GRID 子句不应包括在网格上下文外部的 SELECT 语句中。要获取更多关于网格的信息,请参阅 SET ENVIRONMENT 语句 和 GBase 8s Enterprise Replication 指南。




