使用 GRID 子句来指定跨服务器查询的作用域,该查询的数据源是作为 GBase 8s 网格的节点的数据库服务器的表。
除非会话连接到现有的网格之内的数据库,GRID 子句才是有效的。可通过使用 Enterprise Replication 设施的适当的 cdr 命令和 ifx_grid 例程创建网格。
此语法是对 SQL 的 ANSI/ISO 标准的扩展。
SELECT 语句的 GRID 子句支持下列语法:
任何显式地或隐式地包括 GRID 子句的 SELECT 语句都称为网格查询。网格查询的结果,是来自在每个网格服务器中的带有相同名称和相同模式的跨表的 FROM 子句中的每一表的逻辑 UNION 或 UNION ALL 的符合条件的行。此联合可包括该网格中跨所有节点的表,或跨这些网格节点的子集,称为区域。
如果可选的 ALL 关键字紧跟在 GRID 关键字之后,则网格查询的结果是逻辑的 UNION ALL,意味着该网格查询的结果集可包括重复的行。否则,如果您省略 ALL 关键字,则仅从每一参与的服务器的结果的逻辑 UNION 返回 distinct 值。
对 SET ENVIRONMENT 语句的两个选项可定义缺省的 GRID 子句,以便于任何不带有 GRID 子句的后续的 SELECT 语句被解释为包括该缺省的 GRID 子句的网格查询:
在启用 SET ENVIRONMENT 语句的这些选项之一时,SQL 解析器将当前的缺省 GRID 子句应用到不包括显式的 GRID 子句的会话中的每个 SELECT 语句。在同一时间上的同一会话期间,只有一个缺省的 GRID 子句可起作用。当使用 SET ENVIRONMENT 语句来设置其他关键字选项使选项生效时,或当为不同的网格或区域重置同一关键字选项时,会禁用先前设置的缺省值。
SET ENVIRONMENT SELECT_GRID DEFAULT;_ SET ENVIRONMENT SELECT_GRID_ALL DEFAULT;上述每一语句都阻止数据库服务器将当前的会话中的每个后续的查询都解释为网格查询。除非您在同一会话中定义新的缺省的 GRID 子句,否则,任何后续的 SELECT 语句必须包括显式的 GRID 子句来作为网格查询运行。
SET ENVIRONMENT SELECT_GRID 'region_03' SELECT * FROM tab1; SELECT * FROM tab2;
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;
SELECT * FROM tab1 GRID ALL 'region_04'; SELECT * FROM tab2 GRID ALL 'region_04';
在缺省情况下,如果发出网格查询的数据库服务器不可连接到网格或区域之内的一个或多个节点,显式的或缺省的 GRID 子句指定该网格或区域,则网格查询失败。即使指定的网格或区域中的有些网格服务器不可用,SET ENVIRONMENT 语句仍可启用的另一会话环境变量可从网格查询返回部分的结果:
SET ENVIRONMENT GRID_NODE_SKIP ON;,则数据库服务器不论任何不可用的节点,并从参与的网格服务器返回符合条件的行。您可通过调用 ifx_gridquery_skipped_nodes() 函数来表示任何跳过的节点。
另一函数,ifx_gridquery_skipped_node_count(),可用于检测跳过了多少个节点。要获取更多关于这些函数的信息,请参阅 GBase 8s Enterprise Replication 指南。
在网格查询的 FROM 子句中,仅永久数据库表是有效的。必须通过运行 cdr change gridtable 命令来将它们定义为网格表。
此外,网格查询的 projection 列表不可包括在跨服务器查询中其数据类型不被支持的任何列或表达式。不被支持的数据类型包括所有复合的或大对象类型,以及一些用户定义的类型(UDT)和 opaque 类型。
适用于同一 GBase 8s 示例的跨数据库的分布式 DML 操作中的 DISTINCT 数据类型的相同限制,也适用于网格查询中的 DISTINCT 数据类型。要获取在分布式查询中有效的数据类型的讨论,请参阅主题 跨服务器事务中的数据类型 and 分布式操作中的 DISTINCT 类型。
执行网格查询的用户必须是该网格或区域之内所有节点上的有效用户。
网格查询不可为包含对其外查询引用的子查询。
在网格查询块中,UNION 或 UNION ALL 集合运算符都不是有效的,INTERSECT、MINUS 或 EXCEPT 集合运算符也都不是有效的。
GRID 子句不应包括在网格上下文外部的 SELECT 语句中。要获取更多关于网格的信息,请参阅 SET ENVIRONMENT 语句 和 GBase 8s Enterprise Replication 指南。