返回首页

gbase数据、南大通用产品文档:GBase8cNUMAaware 分配和亲和性

更新日期:2024年09月11日

非统一内存访问(NUMA)是一种计算机内存设计,用于多重处理,其中内存访问时间
取决于内存相对于处理器的位置。处理器可以利用NUMA 的优势,优先访问本地内存(速
度更快),而不是访问非本地内存(这意味着它不会访问另一个处理器的本地内存或处理器
之间共享的内存)。
MOT 内存访问设计时采用了NUMA 感知。即MOT 意识到内存不是统一的,而是通过
访问最快和最本地的内存来获得最佳性能。
NUMA 的优点仅限于某些类型的工作负载,特别是数据通常与某些任务或用户强相关
的服务器上的工作负载。
在NUMA 平台上运行的内储存数据库系统面临一些问题,例如访问远程主内存时,时
延增加和带宽降低。
为了应对这些NUMA 相关问题,
NUMA 感知必须被看作是数据库系统
基本架构的主要设计原则。
为了便于快速操作和高效利用NUMA 节点,
MOT 为每个表的行分配一个指定的内存池,
同时为索引的节点分配一个指定的内存池。每个内存池由多个2MB 的块组成。指定API 从
本地NUMA 节点、来自所有节点的页面或通过轮询分配这些块,每个块在下一个节点上分
配。默认情况下,共享数据池以轮询方式分配,以保持访问均衡,同时避免在不同NUMA
节点之间拆分行。但是,线程专用内存是从一个本地节点分配的,必须验证线程始终运行在
同一个NUMA 节点中。
总结

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
491
MOT 有一个智能内存控制模块,它预先为各种类型的内存对象分配了内存池。这种智
能内存控制可以提高性能,
减少锁并保证稳定性。
事务的内存对象分配始终是NUMA-local,
从而保证了CPU 内存访问的最佳性能,降低时延和争用。被释放的对象返回到内存池中。
在事务期间最小化使用操作系统的malloc 函数可以避免不必要的锁。

可监视外部表的装入或卸载操作的状态。
您可能希望在以下情况监视装入或卸载操作:
• 如果希望经常装入和卸载同一个表,以构建数据集市或数据仓库,那么监视作业
的进度可估算类似作业的时间,供将来使用。
• 如果从命名管道装入或卸载,那么监视 I/O 队列可确定是否有足够数量的 FIFO
虚拟处理器。
监视常用装入和卸载操作
可使用 onstat -g iof 命令查找要查看的文件中的全局文件描述符 (gfd)。然后使用 onstat -
g sql 命令来监视装入和卸载操作。
以下示例显示了样本 onstat -g iof 命令输出。
AIO global files:
Gfd path name bytes read page reads bytes write page writes io/s
3 rootdbs 1918976 937 145061888 70831 36.5

op type count avg. time
seeks 0 N/A
reads 937 0.0010
writes 4088 0.0335
kaio_reads 0 N/A
kaio_writes 0 N/A
要确定装入或卸载操作是否可使用并行执行,请在执行 INSERT 语句之前执行 SET
EXPLAIN ON 语句。SET EXPLAIN 输出显示以下计数:
• 优化器为 INSERT 语句选择的并行 SQL 运算符的数量
• 每个 SQL 运算符要处理的行数
要监视装入操作,请运行 onstat -g sql 来获取会话标识。

监视 FIFO 虚拟处理器
可使用 onstat 命令监视 FIFO VP 的有效使用。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 259 -
可使用 onstat -g ioq 选项显示正在等待执行 I/O 请求的每个 FIFO 队列的长度。以下示
例显示样本输出。
AIO I/O queues:
q name/id len maxlen totalops dskread dskwrite dskcopy
fifo 0 0 0 0 0 0 0
adt 0 0 0 0 0 0 0
msc 0 0 1 153 0 0 0
aio 0 0 9 3499 1013 77 0
pio 0 0 2 3 0 2 0
lio 0 0 2 2159 0 2158 0
gfd 3 0 16 39860 38 39822 0
gfd 4 0 16 39854 32 39822 0
gfd 5 0 1 2 2 0 0
gfd 6 0 1 2 2 0 0
...
gfd 19 0 1 2 2 0 0
以上示例中样本输出内的 q name 字段显示了队列的类型,如 fifo 表示 FIFO VP,或
aio 表示 AIO VP。 如果 q name 字段显示 gfd 或 gfdwq,说明这是其全局文件描述符
与输出的 id 字段匹配的文件的队列。磁盘文件在一个队列中同时包含读写请求。每个磁
盘文件在 onstat -g ioq 输出中显示一行。 管道有单独的读写队列。每个管道在输出中显
示两行:gfd 针对读请求,gfdwq 针对写请求。
len 或 maxlen 字段的值最高为 4(对于装入)或 4 * number_of_writer_threads(对于卸
载)。xuwrite 运算符控制写程序线程的数量。
请使用 totalops 字段中的值,而不是 len 或 maxlen 字段中的值,监视对文件或管道执
行的读或写请求的数量。totalops 字段表示从该文件中读取了 34 KB 的数据,或将 34
KB 的数据写入了该文件。如果 totalops 不增加,说明已停止对文件或管道执行读或写操
作(因为 FIFO VP 正忙)。
要提高性能,请使用 onmode -p 命令增加更多 FIFO VP。FIFO VP 的缺省数量为 1。在
该样本输出中,FIFO 队列内不包含任何数据。例如,如果通常定义两个以上的管道来装
入或卸载,请使用以下样本 onmode 命令增加 FIFO VP 的数量:
onmode -p +2 FIFO
也可以使用 onmode -p 命令除去 FIFO VP。 但是,不能将 FIFO VP 的数量设置为低于
1。
有关更多信息,请参阅《GBase 8s 管理员参考》。

使用 SET DESCRIPTOR 来在系统描述符区域(SDA)中设置值。
随同 GBase 8s ESQL/C 使用此语句。
语法

元素
描述
限制
语法
descriptor
标识指定其值的 SDA
的字符串
先前必须分配了系
统描述符区域
(SDA)
引用字符

descriptor_var
存储 descriptor 的主
变量
与 descriptor 相
同的限制
特定于语

item_num
指定 SDA 中项描述符
的次序位置的无符号整

0 < item_num ≤
(当分配 SDA 时指
定的项描述符的数
目)
精确数值
item_num_var
存储 item_num 的主变

与 item_num 相同
的限制
特定于语


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 991
元素
描述
限制
语法
total_items
指定 SDA 描述的项的
数量的无符号整数
与 item_num 相同
的限制
精确数值
total_items_var
存储 total_items 的
主变量
与 total_items 的
限制相同
特定于语

用法
在您以 DESCRIBE ... USING SQL DESCRIPTOR 语句已描述了 SELECT、
EXECUTE FUNCTION、EXECUTE PROCEDURE、ALLOCATE DESCRIPTOR 或
INSERT 语句之后,可使用 SET DESCRIPTOR 语句。
SET DESCRIPTOR 可在这些情况下给系统描述符区域指定值:

设置系统描述符区域的 COUNT 字段来匹配您正在系统描述符区域中提
供描述的项的数目。

为您正在系统描述符区域中提供描述的每一值设置项描述符

修改项描述符字段的内容
如果在给任何标识的系统描述符字段赋值期间发生错误,则将所有标识了的字段
的内容设置为 0 或 NULL,这依赖于该变量的数据类型。
使用 COUNT 子句
使用 COUNT 子句来设置要在系统描述符区域中被使用的项的数目。如果您分配
给系统描述符区域的项比您正在使用的项更多,则您需要将 COUNT 字段设置为您
实际正在使用的项的数目。下列示例展示 GBase 8s ESQL/C 程序的片段:
EXEC SQL BEGIN DECLARE SECTION;
int count;

EXEC SQL END DECLARE SECTION;

EXEC SQL allocate descriptor 'desc_100'; /*为 100 项分配*/
count = 2;
EXEC SQL set descriptor 'desc_100' count = :count;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 992
使用 VALUE 子句
使用 VALUE 子句来从主变量赋值到系统描述符区域的字段内。您可为您正在为
其提供描述的项赋值(诸如在 WHERE 子句中的参数),或您可在为 UPDATE
或 INSERT 语句使用 DESCRIBE 语句来填充字段之后修改值。
项描述符
使用 SET DESCRIPTOR 语句的“项描述符”部分来为系统描述符中单个字段设置
值。
项描述符


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 993
元素
描述
限制
语法
input_var
为指定的项描述符字
段存储数据的主变量
必须适合于指定的字

特定于语

literal_int
赋值给指定的项描述
符字段的整数值(>
0)
依赖于 = 符号左边
的关键字的限制
精确数值
literal_int_var
有 literal_int 值
的变量
与 literal_int 的
相同
特定于语

要获取更多关于 TYPE 或 ITYPE 字段的有效代码以及它们的含义的信息,请参
阅 设置 TYPE 或 ITYPE 字段。
要获取适用于其他字段类型的限制,请参阅 使用 VALUE 子句 之下单个字段类
型的的标题。
设置 TYPE 或 ITYPE 字段
使用整数值来为每一项设置 TYPE 或 ITYPE 的值。
SQL 数据类型
整数值
X-Open
整数值
SQL 数据类型
整数值
X-Open
整数值
CHAR
0
1
MONEY
8

SMALLINT
1
4
DATETIME
10

INTEGER
2
5
BYTE
11

FLOAT
3
6
TEXT
12

SMALLFLOAT
4

VARCHAR
13

DECIMAL
5
3
INTERVAL
14

SERIAL
6

NCHAR
15

DATE
7

NVARCHAR
16

下表罗列以 GBase 8s 表示可用的附加的数据类型的整数值。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 994
SQL 数据类型
整数值
SQL 数据类型
整数值
INT8
17
固定长度 OPAQUE 类型
41
SERIAL8
18
LVARCHAR(仅限于客户端侧)
43
SET
19
BOOLEAN
45
MULTISET
20
BIGINT
52
LIST
21
BIGSERIAL
53
ROW(未命名的)
22
IDSSECURITYLABEL
2061
COLLECTION
23
ROW(命名的)
4118
可变长 OPAQUE 类

40


在系统目录中,相同的 TYPE 常量还可出现在 syscolumns.coltype 列中。请参
阅 GBase 8s SQL 参考指南。
对于更易于维护的代码,请使用为这些 SQL 数据类型预定义的常量,而不是它
们的实际整数值。在 $GBASEDBT/incl/public/sqltypes.h 头文件中定义这些常
量。然而,您不可在 SET DESCRIPTOR 语句中使用实际的常量名称。相反,将
该常量赋值给整数主变量,并在 SET DESCRIPTOR 语句文件中指定该主变量。
下列示例展示您可在 GBase 8s ESQL/C 中如何设置 TYPE 字段:
main()
{
EXEC SQL BEGIN DECLARE SECTION;
int itemno, type;
EXEC SQL END DECLARE SECTION;
...
EXEC SQL allocate descriptor 'desc1' with max 5;
...
type = SQLINT; itemno = 3;
EXEC SQL set descriptor 'desc1' value :itemno type = :type;
}

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 995
对于 ITYPE,此信息时唯一的。当您创建不符合 X/Open 标准的动态的程序时,
请使用 ITYPE。
不带 -xopen 选项的编译
如果您不带 -xopen 选项编译,则将正常的 GBase 8s SQL 代码赋值为 TYPE。
您必须小心莫将正常的模式与 X/Open 模式搞混,因为可导致错误。例如,如果
数据类型未在 X/Open 模式之下定义,但在正常的模式之下定义,则执行 SET
DESCRIPTOR 语句可导致错误。
在 X/Open 程序中设置 TYPE 字段
在 X/Open 模式中,您必须在 TYPE 字段中使用该数据类型的整数代码的
X/Open 集。
如果您在 SET DESCRIPTOR 语句中使用 ILENGTH、IDATA 或 ITYPE 字
段,则出现警告消息。该警告表示这些字段不是系统描述符区域的标准 X/Open
字段。
对于比较容易维护的代码,请使用这些 X/Open SQL 数据类型的预定义的常量,
而不是它们的实际整数值。在 $GBASEDBT/incl/public/sqlxtype.h 头文件中定义
这些常量。
使用 DECIMAL 或 MONEY 数据类型
如果您为 DECIMAL 或 MONEY 数据类型设置 TYPE 字段,且您想要使用标
度或精度而不是缺省的值,则请设置 SCALE 和 PRECISION 字段。 您不需要
为 DECIMAL 或 MONEY 项设置 LENGTH 字段;相应地从 SCALE 和
PRECISION 字段设置 LENGTH 字段。
使用 DATETIME 或 INTERVAL 数据类型
如果您为 DATETIME 或 INTERVAL 值设置 TYPE 字段,则 DATA 字段可为
DATETIME 或 INTERVAL 文字或字符串。如果您使用字符串,则必须把
LENGTH 字段编码为限定符值。
要为 DATETIME 或 INTERVAL 字符串确定编码的限定符,请在 datetime.h 头
文件中使用 datetime 和 interval 宏。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 996
如果您将 DATA 设置为 DATETIME 或 INTERVAL 的主变量,则不需要显式
地将 LENGTH 设置为编码的限定符整数。
设置 DATA 或 IDATA 字段
当您设置 DATA 或 IDATA 字段时,请使用数据的适当的类型(对于 CHAR
或 VARCHAR 使用字符串,对于 INTEGER 使用整数,等等)。
如果设置任何 DATA 之外的内容,则不定义 DATA 的值。您不可为项设置
DATA 或 IDATA 字段而不为那个项设置 TYPE。 如果您为一项将 TYPE 字
段设置为字符类型,则您还必须设置 LENGTH 字段。如果您未为字符项设置
LENGTH 字段,则会收到错误。
设置 LENGTH 或 ILENGTH 字段
如果您的 DATA 或 IDATA 字段包含字符串,则您必须指定 LENGTH 的值。
如果您指定 LENGTH=0,则自动地将 LENGTH 设置为字符串的最大长度。
DATA 或 IDATA 字段可包含最多 368 字节的文字字符串,或从 CHAR 或
VARCHAR 数据类型的字符变量派生的字符串。这提供了一种自动地确定 DATA
或 IDATA 字段中字符串长度的方法。
如果 DESCRIBE 语句在 SET DESCRIPTOR 语句之前,则自动地将 LENGTH
设置为在您的表中指定的字符字段的最大长度。
此信息对于 ILENGTH 是相同的。当您创建不符合 X/Open 标准的动态的程序
时,请使用 ILENGTH。
设置 INDICATOR 字段
如果您想要将 NULL 值放到系统描述符区域之内,请将 INDICATOR 字段设置
为 -1,且不设置 DATA 字段。
如果您将 INDICATOR 字段设置 0 来表示该数据不为 NULL,则必须设置
DATA 字段。
设置 Opaque 类型字段
下列项描述符字段提供关于以 opaque 类型作为其数据类型的列的信息:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 997

EXTYPEID 字段存储 opaque 类型的扩展的标识符。此整数值必须对应
于 sysxtdtypes 系统目录表的 extended_id 列中的值。

EXTYPENAME 字段存储 opaque 类型的名称。此字符值必须对应于
sysxtdtypes 系统目录表中带有与 extended_id 值相匹配的行的 name 列
中的值。

EXTYPELENGTH 字段存储 opaque 类型名称的长度。此整数值是
EXTYPENAME 字段中字符串的长度,以字节为单位。

EXTYPEOWNERNAME 字段存储 opaque 类型所有者的名称。此字符
值必须对应于 sysxtdtypes 系统目录表中与 extended_id 值相匹配的行的
owner 列中的值。

EXTYPEOWNERLENGTH 字段存储 EXTTYPEOWNERNAME 字段
中值的长度。此整数是 EXTYPEOWNERNAME 字段中字符串的长度,
以字节为单位。
要获取更多关于 sysxtdtypes 系统目录表的信息,请参阅 GBase 8s SQL 参考指
南。
设置 Distinct 类型字段
下列项描述符字段提供关于以 distinct 类型为其数据类型的列的信息:

SOURCEID 字段存储源数据类型的扩展的标识符。
如果该 distinct 类型的源类型是 opaque 数据类型,则设置此字段。此整
数值必须对应于 sysxtdtypes 系统目录表中其 extended_id 值与您正在设
置的 distinct 类型相匹配的行的 source 列中的值。

SOURCETYPE 字段存储源数据类型的数据类型常量。
此值是该 distinct 类型的源类型的内建的数据类型的数据类型常量。
SOURCETYPE 字段的代码与 TYPE 字段的代码相同(设置 TYPE 或
ITYPE 字段页)。此整数值必须对应于 sysxtdtypes 系统目录表中其
extended_id 值与您正在设置的 distinct 类型相匹配的行的 type 列中的
值。
要获取更多关于 sysxtdtypes 系统目录表的信息,请参阅 GBase 8s SQL 参考指
南。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 998
修改由 DESCRIBE 语句设置的值
您可使用 DESCRIBE 语句来修改系统描述符区域的内容,在它被设置之后。
您在 SELECT 或 INSERT 语句上使用 DESCRIBE 之后,必须检查以确定将
TYPE 字段设置为 11 还是 12 来表示 TEXT 或 BYTE 数据类型。如果
TYPE 包含 11 或 12,则您必须使用 SET DESCRIPTOR 语句来将 TYPE 重
置为 116,来表示 FILE 类型。