返回首页

gbase数据、南大通用产品文档:GBase8cSQL 调优关键参数调整

更新日期:2024年09月11日

本节将介绍影响SQL 调优性能的关键数据库主节点配置参数,配置方法参见配置运行
参数。
表14- 4 数据库主节点配置参数
参数/参考值
描述
enable_nestloop=on
控制查询优化器对嵌套循环连接(Nest Loop Join)类型的
使用。当设置为“on”后,优化器优先使用Nest Loop Join;
当设置为“off”后,优化器在存在其他方法时将优先选择其
他方法。
说明:
如果只需要在当前数据库连接(即当前Session)中临时更
改该参数值,则只需要在SQL 语句中执行如下命令:
SET enable_nestloop to off;
此参数默认设置为“on”,
但实际调优中应根据情况选择是否
关闭。一般情况下,在三种join 方式(Nested Loop、Merge
Join 和Hash Join)里,Nested Loop 性能较差,实际调优中
可以选择关闭。
enable_bitmapscan=on
控制查询优化器对位图扫描规划类型的使用。设置为“on”,
表示使用;设置为“off”,表示不使用。
说明:
如果只需要在当前数据库连接(即当前Session)中临时更
改该参数值,则只需要在SQL 语句中执行命令如下命令:
SET enable_bitmapscan to off;
bitmapscan 扫描方式适用于“where a > 1 and b > 1”且a 列和
b 列都有索引这种查询条件,但有时其性能不如indexscan。
因此,
现场调优如发现查询性能较差且计划中有bitmapscan
算子,可以关闭bitmapscan,看性能是否有提升。
enable_hashagg=on
控制优化器对Hash 聚集规划类型的使用。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
562
enable_hashjoin=on
控制优化器对Hash 连接规划类型的使用。
enable_mergejoin=on
控制优化器对融合连接规划类型的使用。
enable_indexscan=on
控制优化器对索引扫描规划类型的使用。
enable_indexonlyscan=on
控制优化器对仅索引扫描规划类型的使用。
enable_seqscan=on
控制优化器对顺序扫描规划类型的使用。完全消除顺序扫
描是不可能的,但是关闭这个变量会让优化器在存在其他
方法的时候优先选择其他方法。
enable_sort=on
控制优化器使用的排序步骤。该设置不可能完全消除明确
的排序,但是关闭这个变量可以让优化器在存在其他方法
的时候优先选择其他方法。
rewrite_rule
控制优化器是否启用LAZY_AGG 和MAGIC_SET 重写规
则。

存储池创建 sbspace(SQL 管理 API)
随同 admin() 或 task() 函数,使用 create sbspace from storagepool 参数来从存储
池的条目中创建 sbspace。
语法

元素
描述
关键考虑
sbspace
sbspace 名。
sbspace 名称必须是唯一的且
不可超过 128 字节。名称必须
以一个字母或下划线开头,
且必
须仅包含字母、数、下划线或
$ 字符。
initial_chunk_size
新 sbspace 的初始 chunk 的
大小,以 KB 为单位。
请参阅 admin() 和 task() 参
数大小规范。
logging_flag
二者之一:

1 = 日志记录

0 = 无日志记录
日志记录标志是可选的。然而,
如果您指定 mirroring 为 1,
则还必须指定日志记录标志。

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 722 -
元素
描述
关键考虑
mirroring_flag
二者之一:

1 = 镜像

0 = 无镜像
镜像标志是可选的。

示例
下列命令创建镜像的且记录日志的名为 sbspace1 的 sbspace。
新 sbspace 的大小为 240
MB。
EXECUTE FUNCTION task("create sbspace from storagepool", "sbspace1",
"240 MB", "1", "1");
下列命令创建无镜像的且不记录日志的名为 sbspace2 的 sbspace。
这个 sbspace 的大小
为 5 GB。
EXECUTE FUNCTION task("create sbspace from storagepool", "sbspace2", "5 GB");

如果您不知道发送至数据库服务器,或从数据库服务器接收的值的数目或数据类型,
则请使用动态管理结构。动态管理结构允许您将数据的变长列表传至数据库服务器,或从
它接收变长列表。

要执行带有位置的列的动态 SQL 语句,
您可在您的 GBase 8s ESQL/C 程序中使用下
列动态管理结构之一:
系统描述符区域是符合 X/Open 标准的与语言无关的数据结构。请您以 SQL 语句
ALLOCATE DESCRIPTOR、GET DESCRIPTOR、SET DESCRIPTOR 和 DEALLOCATE
DESCRIPTOR 来分配和操纵它。
sqlda 结构是您以相同类型的 C 语言语句操作的 C 语言数据结构,您使用其来分配
和操纵其他 C 结构(有 struct 数据类型的区域)。
由于此方法在 SQL 语句内使用 C 语言结构,因此它依赖于语言,且不符合 X/Open
标准。

对于给定的动态 SQL 语句,动态管理结构可保存任何下列信息:
该语句中未知列的数目
对于每一未知的值,数据类型和长度,数据的空间,以及关于任何相关联的变量的信
息(它的数据类型、长度和数据)

然后,GBase 8s ESQL/C 程序可使用此信息来确定要保存该值的主变量适合的长度和

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 465 -

类型。
系统描述符区域
系统描述符区域是由 GBase 8s ESQL/C 声明来保存从准备好的语句返回的数据或由
准备好的数据发送的数据的内存区域。它是符合 X/Open 标准的动态管理结构。

系统描述符区域有两个部分:
有 COUNT 字段构成的固定大小的部分。
此字段包含在系统描述符区域中描述的列的
数目。
对于系统描述符区域中每一值,包含项描述符的变长部分。每一项描述符是一个固定
大小的结构。

对于两个值,下图展示系统描述符区域的样子。

图 1. 展示两个值的系统描述符区域的简图

定长部分
系统描述符区域的固定大小部分有单个字段构成,如下表所示。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 466 -

表 8. 系统描述符区域的固定大小部分中的字段
字段
数据类型
描述
COUNT
short
系统描述符区域中列值的数目或发生率。
这是项
描述符的数目,
每一列一个。
DESCRIBE...USING SQL
DESCRIPTOR 语句将 COUNT 设置为被描述的列
的数目。在您将列值发送至数据库服务器之前,您必
须使用 SET DESCRIPTOR 来初始化该字段。

项描述符
系统描述符区域中的每一项描述符保存关于可传送至数据库服务器或从数据库服务
器收到的数据值的信息。

每一项描述符由下表总结的字段组成。

表 9. 系统描述符区域的每一项描述符中的字段
字段
数据类型
描述
DATA
char
*
指向发送至数据库服务器或从数据库服务器
接收的列数据的指针。
TYPE
short
表示正在转换的列的数据类型的整数。在
sqltypes.h 和 sqlxtype.h 头文件中定义
这些值。
LENGTH
short
以字节计的 CHAR 类型数据的长度,
DATETIME 或 INTERVAL 数据的编码的限定
符,或 DECIMAL 或 MONEY 值的大小。
NAME
char
*
指向包含列名称或正在转换的显示标签的字
符数组的指针。
INDICATOR
short
可包含两个值之一的指示符变量:
0
需要 DATA 字段来包含非空数据。
-1
当未指定 DATE 字段值时,插入 NULL。
SCALE
short
包含在 DATA 字段中的列的范围;仅对于
DECIMAL 或 MONEY 数据类型定义。
PRECISION
short
包含在 DATA 字段中的列的精度;仅为
DECIMAL 或 MONEY 数据类型定义。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 467 -

字段
数据类型
描述
NULLABLE
short
指定该列可否(在 DESCRIBE 语句之后)包
含空值:
1
该列允许空值
0
该列不允许空值。

在执行 EXECUTE 语句或动态 OPEN 语句
之前,必须将它设置为 1 来指示在 INDICATOR
字段中指定指示符值,而如果未指定它,则设置为
0。(当您执行动态 FETCH 语句时,忽略
NULLABLE 字段。
IDATA
char
*
用户定义的指示符数据,或包含 DATA 字段
的指示符语句的主变量名称。IDATA 字段不是标
准 X/Open 字段。
ITYPE
short
用户定义的指示符变量的数据类型。在
sqltypes.h 和 sqlxtype.h 头文件中定义
这些值。
ITYPE 字段不是标准 X/Open 字段。

ILENGTH
short
以字节计的用户定义的指示符的长度。
ILENGTH 字段不是标准 X/Open 字段。
EXTYPEID
int4
用户定义的
(opaque 或 distinct)
或复合的
(集
合或 row)数据类型的扩展的标识符。
EXTYPENAME
char
*
用户定义的
(opaque 或 distinct)
或复合的
(集
合或 row)数据类型的名称。
EXTYPELENGTH
short
以字节计的 EXTYPENAME 字段中的字符串
的长度。
EXTYPEOWNERNAME
char
*
用户定义的
(opaque 或 distinct)
或复合的
(集
合或 row)数据类型的所有者的名称(对于 ANSI
数据库)。
EXTYPEOWNERLENGT
H
short
以字节计算的 EXTYPEOWNERNAME 字段
中的字符串的长度。
SOURCETYPE
short
对于 distinct 类型列,
源数据类型的数据类型
常量(来自 sqltypes.h)。
SOURCEID
int4
对于 distinct 类型列,
源数据类型的扩展的标

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 468 -

字段
数据类型
描述
识符。

sqlda 结构
sqlda 结构是保存从准备好的语句返回的数据的 C 结构
(在 sqlda.h 头文件中定义)



每一 sqlda 结构有三部分:
由 sqld 字段构成的定长部分,其包含在 sqlda 结构中描述的列的数目。
对于为每一列值,
包含 sqlvar_struct 结构的变长部分。
每一 sqlvar_struct 结构是定长
的结构。
包括关于 sqlda 结构自身的描述性信息。

对于两个值,下图展示 sqlda 结构看上去的样子。

图 2. 展示两个值的 sqlda 结构的简图


图 1展示单个数据缓冲区中 sqldata 字段中的列数据。
可在分开的缓冲区中存
储此数据。
定长部分

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 469 -

下表描述 sqlda 结构的定长部分,其由单个字段构成。

表 10. sqlda 结构的定长部分中的字段
字段
数据类型
描述
sqld
short
sqlda 中列值的数目或发生率。
这是 sqlvar_struct 结构的数
目,每一列一个。DESCRIBE...INTO 语句将 sqld 设置为被描述
的列的数目。在您将列值发送至数据库服务器之前,您必须设置
sqld 来初始化该字段。
sqlvar_struct 结构
当完全地定义它的所有组件时,对于该集中的每一变量,sqlda 结构指向
包含必要信息的 sqlvar_struct 结构的序列的初始地址。
每一 sqlvar_struct
结构保存可发送至数据库服务器或从数据库服务器接收的数据值。您的程序通
过 sqlda 的 sqlvar 字段访问这些 sqlvar_struct 结构。表 1和 表 2总结
sqlda 的变长结构。

表 11. 访问 sqlda 结构的变长部分的字段
字段
数据类型
描述
sqlv
ar
struct
sqlvar_struct *
指向 sqlda 结构的变长部分的指针。从数据库服务器返回的
或发送至数据库服务器的每一列值有一个 sqlvar_struct。sqlvar
字段指向第一个 sqlvar_struct 结构。

下表展示 sqlvar_struct 结构中的字段。

表 12. sqlvar_struct 结构中的字段
字段
数据类型
描述
sqltype
short
标识数据库服务器发送或接收的列的数据类型的整
数。
在 sqltypes.h 和 sqlxtype.h 头文件中定义这
些值。
sqllen
short
以字节计的 CHAR 类型数据的产度,或 DATETIME
或 INTERVAL 值的编码的限定符。该长度的含义依赖于信
息的类型,以及如何使用该 sqlda:
当您以 DESCRIBE 语句检索 sqlda 结构时,
自动地将
sqllen 字段中的值设置为该数据在磁盘上占据的空间的长
度。该值来自系统目录。
当您将数据访存至缓冲区内,或通过缓冲区发送数据
时,您必须将 sqllen 字段中的值设置为用于该列的内存缓
冲区的大小。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 470 -

字段
数据类型
描述
sqldata
char *
指向数据库服务器发送或接收的列数据的指针。
sqlind
short *
对于可包含两个值之一的列,指向指示符变量指针:
0
sqldata 字段包含非空数据。
-1
sqldata 字段包含空数据。
sqlname
char *
指向包含列名称数据库服务器发送或接收的显示标签
的字符数组的指针。
sqlformat
char *
为将来的使用保留。
sqlitype
short
指定用户定义的指示符变量的数据类型的整数。在
sqltypes.h 和 sqlxtype.h 头文件中定义这些值。
sqlilen
int4
以字节计的用户定义的指示符变量的长度。
sqlidata
char *
指向用户定义的指示符变量的数据的指针。
sqlxid
int4
用户定义的(opaque 或 distinct)或复合的(集合或
row)数据类型的扩展的标识符。
sqltypename
char *
用户定义的(opaque 或 distinct)或复合的(集合或
row)数据类型的名称。
sqltypelen
short
以字节计的 sqltypename 字段中的字符串的长度。
sqlownername
char *
用户定义的(opaque 或 distinct)或复合的(集合或
row)数据类型的所有者的名称(对于 ANSI 数据库)。
sqlownerlen
short
以字节计的 sqlownername 字段中的字符串的长度。
sqlsourcetype
short
对于 distinct 类型列,
源数据类型的数据类型常量
(来
自 sqltypes.h)。
sqlsourceid
int4
对于 distinct 列,源数据类型的扩展的标识符。
sqlflags
int4
通常内部使用此字段。然而,如果由 DESCRIBE 语句
已初始化了该 sqlda 结构,
则您可通过使用在 sqltypes.h 中
定义的 ISCOLUMNULLABLE() 宏来确定该列是否接受
空。如果它返回 1,则该列接受空。
在 sqltypes.h 中定义 ISCOLUMNULLABLE() 宏。

描述性信息
下表总结描述 sqlda 结构自身的 sqlda 字段。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 471 -


表 13. 在 sqlda 结构中的描述性字段
字段
数据类型
描述
desc_nam
e
char[19]
描述符的名称;最大 18 字符
desc_occ
short
sqlda 结构的大小
desc_next
struct sqlda
*
指向下一 sqlda 结构的指针