返回首页

gbase数据、南大通用产品文档:GBase8sifx_rc_insert() 函数

更新日期:2024年09月11日

ifx_rc_insert() 函数将新的值插入到集合中。
语法
ifx_rc_insert(rchandle, value, action, jump)
参数
该函数接受以下参数。
参数
类型
用于
描述
rchandle
HINFX_RC
输入
集合缓冲区的句柄
value
元素的数据类型
输入
要插入的值
action
SQL_SMALLINT
输入
元素相对于查找位置的位置。值可能为:
l
SQL_INFX_RC_ABSOLUTE:: 元素
jump ,缓冲区中的第一个元素是元素
1
l
SQL_INFX_RC_CURRENT:当前元素
l
SQL_INFX_RC_FIRST:第一个元素
l
SQL_INFX_RC_LAST:最后一个元素
l
SQL_INFX_RC_NEXT:下一个元素
l
SQL_INFX_RC_PRIOR:上一个元素
l
SQL_INFX_RC_RELATIVE:
: jump 跳
过当前元素的元素

jump
SQL_SMALLINT
输入
当 action 是 SQL_INFX_RC_ABSOLUTE
或 SQL_INFX_RC_RELATIVE 时,偏移
用法
ifx_rc_insert() 函数将新的元素插入到 action 和 jump 指定之前的位置。
函数将查找位置设
置为已插入的值的位置。无法向行插入新的元素。
下表描述了每种集合类型的允许的插入操作。
集合的类型
允许插入的位置
List
缓冲区中的任何位置
Set 或 multiset
缓冲区的末尾
如果由 action 和 jump 值的查找位置超出缓冲区的末尾,则 ifx_rc_insert() 将新的元素附
加到缓冲区的末尾。
同样地,
如果 action 和 jump 指定查找位置在缓冲区的起始位置之前,

GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 184 -

则 ifx_rc_insert() 在缓冲区的开头插入新的元素。如果 action 指定一个插入的指针而不是
set 或 multiset 的末尾,则 ifx_rc_insert() 失败。
例如,如果 action 是 SQL_INFX_RC_LAST,则该函数在最后一个元素之前插入新值。要
附加新的元素,请采取以下操作:

将查找位置设置为缓冲区的末尾,并将 action 设置为 SQL_INFX_RC_NEXT。

将 action 设置为 SQL_INFX_RC_ABSOLUTE 或 SQL_INFX_RC_RELATIVE ,并将 jump
设置为超出缓冲区末尾的值。
要在缓冲区的开始位置插入新的值,请将 action 设置为 SQL_INFX_RC_FIRST。

说明
当查询所涉及的表存在Hash 分布的列,并且查询条件为该列等值查询,则可以利
用该功能(支持一致Hash 和节点总数静态Hash),将查询发送到指定Hash 节点
以减少参与运算的节点以及客户端和服务器端连接等消耗。

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 719
支持UNION ALL 各个Hash 查询语句的并行执行。
使用优化方法

设置集群配置参数gcluster_special_correlated_optimize = 0 | 1,该参数用于设置
是否尝试对相关子查询进行动态重分布优化。
参数值为0:关闭本优化。
参数值为1:开启本优化(默认值)。

设置集群配置参数gcluster_crossjoin_use_hash_distribution=0 | 1,用于在JOIN
两边都不是hash 列时,设置是否仍强制使用相关子查询进行动态重分布优化。

参数值为0:关闭。
参数值为1:开启(默认值)。
说明
上面的两个参数属于父子参数关系。

当gcluster_special_correlated_optimize = 0 时,无轮如何设置参数
gcluster_crossjoin_use_hash_distribution 的值,都不会开启本优化。

当gcluster_special_correlated_optimize = 1,而gcluster_crossjoin_use_hash_distribution = 0
时,也不会开启本优化。

当gcluster_special_correlated_optimize = 1,并且gcluster_crossjoin_use_hash_distribution
= 1 时,才会开启本优化。
示例
首先,使用SET 语句设置上面2 个参数的值都为1,下面的语句可以进行等值hash
查询优化。
SELECT COUNT(*) FROM x1 WHERE EXISTS(SELECT 1 FROM x2 WHERE x1.id2 = x2.id2);
使用约束

查询语句中,使用了跨层关系,禁止优化。
下面的SQL 语句不会进行优化,
因为x3.id3 = x1.id3 是跨层相关子查询的条件,
所以不能优化。
SELECT COUNT(*) FROM x1 WHERE EXISTS
(

SELECT 1 FROM x2 WHERE x2.id2 = x1.id2

AND EXISTS

(

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 720


SELECT 1 FROM x3 WHERE x3.id3 = x1.id3

)
);

查询语句中,使用了跨层子查询,并且跨层列出现在PROJECTION 部分时,
禁止优化。
下面的SQL 语句不会进行优化,因为SELECT x1.entry_id FROM x3 中,x1 和
x3 属于跨层关系
(不是父子关系)

并且x1.entry_id 出现在最里面的子查询的
PROJECTION 部分,所以不能优化。
SELECT Count(*) FROM x1
WHERE EXISTS
(

SELECT 1 FROM x2

WHERE x2.id2 = x1.id2

AND x2.entry_id IN

(


SELECT x1.entry_id FROM x3 WHERE x2.id3 = x3.id3

)
);

查询语句中,相关子查询在HAVING 中,禁止优化。
下面的SQL 语句不会进行优化,因为HAVING 中包含了子查询语句。
SELECT COUNT(*) FROM x1 GROUP BY id2
HAVING EXISTS
(

SELECT 1 FROM x2 WHERE x2.id2 = x1.id2
);

查询语句中,相关子查询属于PROJECTION 部分,禁止优化。
下面的SQL 语句不会进行优化,
因为子查询语句SELECT 1 FROM x2 WHERE
x1.id2 = x2.id2 LIMIT 1 属于外部查询语句的PROJECTION 部分,所以不能优
化。
SELECT
(

SELECT 1 FROM x2 WHERE x1.id2 = x2.id2 LIMIT 1
) FROM x1;

查询语句中,两层相关子查询,外层不能走优化,导致内层一并不能走优化。

下面的SQL 语句不会进行优化,因为最外层子查询语句SELECT 1 FROM x2
WHERE x1.id2 > x2.id2 中不是等值查询条件,所以不能优化。
SELECT COUNT(*) FROM x1
WHERE EXISTS
(

SELECT 1 FROM x2

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 721

WHERE x1.id2 > x2.id2

AND EXISTS

(


SELECT 1 FROM x3 WHERE x3.id3 = x2.id3

)
);

查询语句中,
相关条件不是out.col = inner.col 类型
(如out.col > inner.col,
或者
不是单纯的字段,
而是表达式,
如ABS(out.col) = inner.col,
都是不支持优化的)


下面的SQL 语句不会进行优化,因为子查询语句中ABS(x1.id2) = x2.id2 使用
了函数,所以不能优化。
SELECT COUNT(*) FROM x1 WHERE EXISTS(SELECT 1 FROM x2 WHERE ABS(x1.id2) = x2.id2);

GBA-03OT-0002
错误码
错误标识
错误信息
GBA-03OT-0002

数据分布相关错误
错误出现原因
获取某distribution 信息失败
分析与建议
检查distribution 相关状态