返回首页

gbase数据、南大通用产品文档:GBase8aFrom 子查询复用优化—使用grouped hint 支持多列重分布

更新日期:2024年09月11日

当指定如下hint 函数时,from 子查询的结果先保存到临时表中,再被后续查询使
用。
hint 函数名:grouped
功能:指定结果集重分布方式
取值:[-10|-2|-1|投影列下标列表]
默认值:-10
说明:
-10 表示保持结果集分布属性不变;
-2 表示结果集拉复制表;
-1 表示结果集RoundRobin 分布;
投影列下标从0 开始,所以投影列下标列表表示为大于等于0 的1 个或多个值,
中间用逗号间隔,
结果集按列标指定的列进行hash 重分布。
如果有下标超出投影
列范围则hint 无效。

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1311
select /*+grouped('-10')*/ ...... 子查询结果不进行重分布,按原样存储
select /*+grouped('-2')*/ ...... 子查询结果拉复制表
select /*+grouped('2')*/ ...... 子查询结果按投影列第3 列进行hash 重分布
select /*+grouped('2,3')*/ ...... 子查询结果按投影列第3、4 列进行hash 重分布
注意:
1.from 子查询展开后将不再存在时,如果指定了hint,则不再展开
2.from 子查询被投影列剪枝时,
如果hint 指定了hash 重分布,
则不再进行剪枝优

如:
select * from (select /*+grouped('-2')*/ * from x1) xx, x2 where xx.id2=x2.id4;
如果没有hint,则xx 会先进行hash 重分布,然后与x2 进行join,hint 指定了xx
拉复制表后,计划变成xx 拉复制表,然后与x2 进行join。

GBA-01BR-0071

GBase 8a MPP Cluster 产品手册
7 附录
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1700
错误码
错误标识
错误显示信息
GBA-01BR-0071

Remove previous data file %s for recover
single table
Error
错误出现原因
表恢复时,删除旧数据文件失败
分析与建议
查看当前数据库数据文件夹状态及权限

使用 SQLSetConnectAttr() 函数来指定服务器使用的回调函数。
SQLSetConnectAttr() 也用于指定回调函数使用的参数。参数属性按照为驱动程序指定的
方式传回回调函数。
下列属性是特定于 GBase 8s 的对 ODBC 标准的扩展:
参数
类型
描述

GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 21 -
参数
类型
描述
SQL_INFX_ATTR_PAM_FUNCTION
void * 指向回调函数的指针。
SQL_INFX_ATTR_PAM_RESPONSE_BUF
void * 指向包含对认证质询的响应的缓
冲区的通用指针。
SQL_INFX_ATTR_PAM_RESPONSE_LEN
int
响应缓冲区的长度,以字节计。
SQL_INFX_ATTR_PAM_RESPONSE_LEN_
PTR
int *
存储响应中的字节数的地址。
SQL_INFX_ATTR_PAM_CHALLENGE_BU
F
void * 指向包含认证质询的缓冲区的通
用指针。
驱动程序将从服务器收到
的任何质询都存储在此缓冲区内。
如果该缓冲区未大到足以包含该
质询,则截断质询。通过将缓冲区
长度与质询中的字节数相对比,

调函数可检测到此质询。
由应用程
序开发人员负责检测此情况,
并正
确地处理它。
SQL_INFX_ATTR_PAM_CHALLENGE_BU
F_LEN
int
质询缓冲区的长度,以字节计。
SQL_INFX_ATTR_PAM_CHALLENGE_LE
N_PTR
int *
存储质询中字节数的地址。
质询和响应缓冲区指针可为空。如果认证服务器要求存储缓冲区中的信息,则由于认证
失败导致连接失败。无论连接是否成功,都会返回质询长度信息。如果消息类型不需要
响应,则响应缓冲区可能为空(缺省的),或它可能包含空字符串。
可在任何时刻,以任何顺序来设置前面表中的属性。然而,它们仅对以驱动程序的连接
函数之一的后续调用建立的连接有效。
通过使用下列连接属性之一,使用 SQLSetConnectAttr() API 设置隔离级别:

SQL_TXN_READ_UNCOMMITTED = Read Uncommitted

SQL_TXN_READ_COMMITTED = Read Committed

SQL_TXN_SERIALIZABLE = Serializable

SQL_TXN_REPEATABLE_READ = Repeatable Read

SQL_TXN_LAST_COMMITTED = Last Committed

SQL_TXN_TRANSACTION = Transaction
如果随同 SQLSetConnectAttr() API 使用 SQL_TXN_LAST_COMMITTED 或
SQL_TXN_TRANSACTION 属性,则您的应用程序必须直接链接至 GBase 8s ODBC
Driver,而不连接至 ODBC Driver Manager。然而,如果在 odbc.ini 文件或 Data Source
Administrator 中指定该属性,则应用程序可以使用 ODBC Driver Manager 连接。
如果使用 SQL_TXN_TRANSACTION 属性,则将在 DTC 应用程序中设置的隔离级别
传播至服务器。仅应在 Windows™ DTC 应用程序中使用此选项。

GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 22 -
ODBC 驱动程序的默认行为是从 VARCHAR 列结果的结尾除去空字符。要保留结尾的
空白,请设置 SQL_INFX_ATTR_LEAVE_TRAILING_SPACES 属性:
SQLSetConnectAttr( hdbc, SQL_INFX_ATTR_LEAVE_TRAILING_SPACES,
(SQLPOINTER)SQL_TRUE, SQL_IS_INTEGER );
要除去结尾的空白,请将 SQL_TRUE 更改为 SQL_FALSE。
将该行为限定至连接。
连接池和认证
在 ODBC 中,驱动程序管理器控制连接池。
当使用认证时,应用程序编程人员必须意识到连接池的影响。驱动程序管理器不控制其
连接何时置于池中,
或者何时从池中拉出。
如果应用程序不了解用户就连接或断开连接,
则连接池的性能优势得以保持,用户不会收到任何意外的认证质询。如果应用程序未使
用户意识到他们正在重建连接,则仍没有认证问题,因为驱动程序管理器与服务器之间
的连接从未关闭。

连接函数
可随同认证模块使用任何建立连接的 ODBC 函数,SQLConnect()、SQLDriverConnect()
或 SQLBrowseConnect()。
当使用这些函数时,请考虑下列事项:
SQLConnect() 函数
SQLConnect() 函数的 DriverCompletion 参数可采用下列值

SQL_DRIVER_PROMPT

SQL_DRIVER_COMPLETE

SQL_DRIVER_COMPLETE_REQUIRED

SQL_DRIVER_NOPROMPT
如果预料到有认证挑战,则推荐您使用 SQL_DRIVER_NOPROMPT。使用其他值可能
导致用户面对认证信息的多个请求。
SQLBrowseConnect() 函数
设计 SQLBrowseConnect() 函数旨在反复使用,驱动程序为应用程序提供关于如何完成
连接字符串的指导,且应用程序提示用户所需的值。这可导致用户在连接字符串完成与
认证之间面对多个提示。
此外,
作为连接字符串完成进程的一部分,
驱动程序通常向应用程序提供数据库的选择。
然而,在用户通过身份验证之后,驱动程序才能为数据库的列表查询服务器。根据应用
程序逻辑,它是在原始的连接字符串中提供数据库名称,还是打算从认证服务器接受质
询,当服务器使用认证时,可能无法使用 SQLBrowseConnect()。


GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 23 -
第三方应用程序或中间代码
当使用认证时,应由应用程序处理来自认证服务器的任何质询。
要处理质询,
应用程序编程人员必须能够向驱动程序注册回调函数。
由于在 ODBC 标准
中未定义用来完成此任务的属性,因此,使用的属性为 GBase 8s 扩展。
以 Microsoft™ 的 ADO 层编写的许多应用程序从开发人员抽取 ODBC 调用。大多数
Visual Basic 应用程序都用 ADO 层编写。这些应用程序和第三方应用程序通常不知道
GBase 8s 扩展,且不能处理身份验证质询。
Windows™ 上的 ODBC Data Source Administrator 也属于第三方应用程序这一类。
当配置
UNIX™ 数据源时,不是所有特性都可用。例如,如果收到质询,则 Apply and Test
Connection 按钮和 User Server Database Locale 切换不起作用,
因为那些特性需要连接到
服务器的能力。