返回首页

gbase数据、南大通用产品文档:GBase8c语法

更新日期:2024年09月11日

kdestroy [-A] [-q] [-c cache_name]

在性能调优过程中,可以根据实际业务情况修改关键操作系统(OS)配置参数,以提
升GBase 8c 数据库的性能。
前提条件
需要用户使用gs_check 检查操作系统参数结果是否和建议值保持一致,如果不一致,
用户可根据实际业务情况去手动修改。
内存相关参数设置
配置“sysctl.conf”文件,修改内存相关参数vm.extfrag_threshold 为1000(参考值),
如果文件中没有内存相关参数,可以手动添加。
vim /etc/sysctl.conf
修改完成后,请执行如下命令,使参数生效。
sysctl -p
网络相关参数设置
配置“sysctl.conf”文件,修改网络相关参数,如果文件中没有网络相关参数,可以手
动添加。详细说明请参见表15-1。
vim /etc/sysctl.conf
在修改完成后,请执行如下命令,使参数生效。
sysctl -p
表14- 2 网络相关参数
参数名
参考值
说明
net.ipv4.tcp_timestamps
1
表示开启TCP 连接中TIME-WAIT sockets
的快速回收,默认为0,表示关闭,1 表示
打开。
net.ipv4.tcp_mem
94500000
915000000
927000000
第一个数字表示,当tcp 使用的page 少于
94500000 时,kernel 不对其进行任何的干
预。
第二个数字表示,当tcp 使用的page 超过
915000000
时,kernel 会进入“memory

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
523
pressure”压力模式。
第三个数字表示,当tcp 使用的pages 超过
927000000 时,就会报:Out of socket
memory。
net.ipv4.tcp_max_orphans
3276800
最大孤儿套接字(orphan sockets)数。
net.ipv4.tcp_fin_timeout
60
表示系統默认的TIMEOUT 时间。
net.ipv4.ip_local_port_range
26000 65535
TCP 和UDP 能够使用的port 段。
设置10GE 网卡最大传输单元(MTU),使用ifconfig 命令设置。10GE 网卡推荐设置
为8192,可提升网络带宽利用率。
示例:
#ifconfig ethx mtu 8192
#ifconfig ethx
ethx
Link encap:Ethernet
HWaddr XX:XX:XX:XX:XX:XX
inet addr:xxx.xxx.xxx.xxx
Bcast:xxx.xxx.xxx.xxx
Mask:xxx.xxx.xxx.0
inet6 addr: fxxx::9xxx:bxxx:xxxa:1d18/64 Scope:Link
UP BROADCAST RUNNING MULTICAST
**MTU:8192**
Metric:1
RX packets:179849803 errors:0 dropped:0 overruns:0 frame:0
TX packets:40492292 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:17952090386 (17120.4 Mb)
TX bytes:171359670290 (163421.3 Mb)

ethx 为10GE 数据库内部使用的业务网卡。

第一条命令设置MTU,
第二条命令验证是否设置成功,
粗体部分为MTU
的值。

需使用root 用户设置。
设置10GE 网卡接收(rx)、发送队列(tx)长度,使用ethtool 工具设置。10GE 网卡
推荐设置为4096,可提升网络带宽利用率。
示例:
# ethtool -G ethx rx 4096 tx 4096
# ethtool -g ethx
Ring parameters for ethx:
Pre-set maximums:

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
524
RX:
4096
RX Mini:
0
RX Jumbo:
0
TX:
4096
Current hardware settings:
RX:
4096
RX Mini:
0
RX Jumbo:
0
TX:
4096

ethx 为10GE 数据库内部使用的业务网卡。

第一条命令设置网卡接收、
发送队列长度,
第二条命令验证是否设置成功,
示例的输出表示设置成功。

需使用root 用户设置。
I/O 相关参数设置
设置hugepage 属性。通过如下命令,关闭透明大页。
echo never >
/sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
修改完成后,请执行如下命令,使参数生效。
reboot


GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 245 -

隔离级别是您的程序与其他程序的并发操作的隔离程度。数据库服务器提供隔离级别的选
择,反映当程序读数据时,程序如何使用锁的不同的规则集。
要设置隔离级别,请使用 SET ISOLATION 或 SET TRANSACTION 语句。SET
TRANSACTION 语句还允许您设置访问模式。
要获取关于访问模式的更多信息,
请参阅 使
用访问模式来控制数据修改。
对比 SET TRANSACTION 与 SET ISOLATION
SET TRANSACTION 语句符合 ANSI SQL-92。此语句类似于 GBase 8s SET ISOLATION
语句;然而,SET ISOLATION 语句不符合 ANSI,且不提供访问模式。
下表展示您使用 SET TRANSACTION 与 SET ISOLATION 语句设置的隔离级别之间的
关系。
SET TRANSACTION 相关联的
SET ISOLATION
Read Uncommitted
Dirty Read
Read Committed
Committed Read
不支持
Cursor Stability
(ANSI) Repeatable Read
Serializable
(GBase 8s) Repeatable Read
(GBase 8s) Repeatable Read
SET TRANSACTION 与 SET ISOLATION 语句之间的主要差异是,在事务内隔离级别的
行为。对于一个事务,仅可发出 SET TRANSACTION 语句一次。请保证在那个事务期间
打开的任何游标都有那个隔离级别(或访问模式,如果您正在定义访问模式的话)。在启
动事务之后,您可使用 SET ISOLATION 语句在该事务内多次更改隔离级别。下列示例说
明使用 SET ISOLATION 与使用 SET TRANSACTION 之间的差异。
SET ISOLATION
EXEC SQL BEGIN WORK;
EXEC SQL SET ISOLATION TO DIRTY READ;
EXEC SQL SELECT ... ;
EXEC SQL SET ISOLATION TO REPEATABLE READ;
EXEC SQL INSERT ... ;
EXEC SQL COMMIT WORK;
-- Executes without error
SET TRANSACTION
EXEC SQL BEGIN WORK;
EXEC SQL SET TRANSACTION ISOLATION LEVEL TO SERIALIZABLE;

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 246 -

EXEC SQL SELECT ... ;
EXEC SQL SET TRANSACTION ISOLATION LEVEL TO READ COMMITTED;
Error -876: Cannot issue SET TRANSACTION once a transaction has started.

ANSI Read Uncommitted 与 GBase 8s Dirty Read 隔离
最简单的隔离级别 ANSI Read Uncommitted 和 GBase 8s Dirty Read 实际上相当于没有隔
离。当程序访存行时,它不放置锁,且不考虑任何东西;它只是从数据库复制行,而不考
虑其他程序正在做什么。
程序总是收到完整的数据行。即使在 ANSI Read Uncommitted 或 GBase 8s Dirty Read 隔
离之下,程序也从不看到行中是否更新了某些列而有些没更新。然而,使用 ANSI Read
Uncommitted 或 GBase 8s Dirty Read 隔离的程序有时会在更新程序结束它的事务之前读
取更新了的行。
如果更新程序后来回滚它的事务,
则读取程序处理从未真正存在的数据
(在
并发问题列表中的可能性编号 4。)
ANSI Read Uncommitted 或 GBase 8s Dirty Read 是最有效率的隔离级别。 读取程序从不
等待,且从不使另一程序等待。 它是任何下列情况下首选的级别:

所有表都是静态的;即,并发程序仅读取数据,且从不修改数据。

在排他锁中保持表。

仅一个程序正在使用该表。

ANSI Read Committed 与 GBase 8s Committed Read 隔离
当程序请求 ANSI Read Committed 或 GBase 8s Committed Read 隔离级别时,数据库服务
器保证它从不返回未提交到数据库的行。此操作防止读取未提交的或后来回滚的数据。
ANSI Read Committed 或 GBase 8s Committed Read 实现简单。
在它访存行之前,
数据库服
务器测试来确定更新进程是否在该行上放置了锁;如果没有,则它返回该行。由于已被更
新了的(但还未提交的)行在它们上面有锁,因此,此测试确保程序不读取未提交的数据。

ANSI Read Committed 或 GBase 8s Committed Read 实际上不在访存了的行上放置锁,因
此,此隔离级别几乎与 ANSI Read Uncommitted 或 GBase 8s Dirty Read 一样有效率。当
将每一行数据作为独立的单元处理,未引用同一表或其他表中的其他行时,适于使用此隔
离级别。
然而,
如果由于并发会话持有行上的共享锁,
导致放置该测试锁的尝试不成功,
则在 ANSI
Read Committed 或 GBase 8s Committed Read 会话中可发生锁定冲突。要避免等待并发进
程(通过提交或回滚来)释放共享锁, GBase 8s 支持 Committed Read 隔离级别的 Last
Committed 选项。当此 Last Committed 选项生效时,由另一会话的共享锁导致该查询返回
该行的最近提交了的版本。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 247 -

还可通过将 USELASTCOMMITTED 配置参数设置为 'COMMITTED READ' 或设置为
'ALL',或通过当用户连接到数据库时设置 sysdbopen( ) 过程中的 SET ENVIRONMENT
语句中的 USELASTCOMMITTED 会话环境选项,来激活 Last Committed 特性。要获取
关于 ANSI Read Committed 的 Last Committed 选项,
或 GBase 8s Committed Read 隔离级
别的更多信息,请参阅《GBase 8s SQL 指南:语法》中的 SET ISOLATION 语句的描述。
要获取关于 USELASTCOMMITTED 配置参数的信息,请参阅《GBase 8s 管理员参考手
册》。

GBase 8s Cursor Stability 隔离
仅可随同 GBase 8s SQL 语句 SET ISOLATION 使用下一级别 Cursor Stability。
当 Cursor Stability 生效时,
GBase 8s 在访存的最新的行上放置锁。
它为普通的游标放置共
享锁,或为更新游标放置可提升锁。一次仅锁定一行;即,每一次访存一行,释放前一行
上的锁
(除非更新那一行,
在此情况下,
保持该锁直到事务结束为止。

由于 Cursor Stability
一次仅锁定一行,因此,它对并发的限制低于表锁或数据库锁。
Cursor Stability 确保在程序检测行时,不更改它。当程序更新基于从该行读取的数据的某
个其他的表时,这样的行稳定性非常重要。由于 Cursor Stability,程序保证更新是基于当
前的信息的。它防止使用陈旧数据。
下列示例说明 Cursor Stability 隔离的有效使用。根据演示数据库,程序 A 想要为制造商
Hero (HRO) 插入新的库存商品。与此同时,程序 B 想要删除制造商 HRO 以及所有与它
相关联的库存。可发生下列事件的序列:
1. 在 Cursor Stability 之下操作的程序 A 从 manufact 表访存 HRO 行来获取制造商
代码。此操作在该行上放置共享锁。
2. 对于那一行,
程序 B 发出 DELETE 语句。
由于该锁,
数据库服务器让该程序等待。

3. 程序 A 使用它从 manufact 表获得了的制造商代码在 stock 表中插入新行。
4. 程序 A 在 manufact 表上关闭它的游标,或读取不同的行,释放它的锁。
5. 程序 B 从等待中被释放,
完成该行的删除,
并继续删除那些使用制造商代码 HRO
的 stock 的行,包括程序 A 刚刚插入的行。
如果程序 A 使用较低级别的隔离,则会发生下列序列:
1. 程序 A 读取 manufact 表的 HRO 行来获取制造商代码。未放置锁。
2. 对于那一行,程序 B 发出 DELETE 语句。操作成功。
3. 程序 B 删除使用制造商代码 HRO 的所有 stock 行。
4. 程序 B 结束。
5. 程序 A 不知道该 HRO 行的它的副本现在是无效的,使用制造商代码 HRO 插入
新的 stock 行。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 248 -

6. 程序 A 结束。
最后,
在 stock 中出现一行,
在 manufact 中没有与之相匹配的制造商代码。
而且,
程序 B
显然有问题;它未删除本应删除的行。使用 Cursor Stability 隔离级别可防止这些后果。
即使使用 Cursor Stability,
重新安排前面的场景也可能失败。
只需要让程序 B 以与程序 A
相反的序列对表操作。如果在程序 B 移除 manufact 的行之前,从 stock 删除它,则任何
程度的隔离都不可防止出错。每当可能发生这种错误时,所有涉及到的程序都必须使用相
同的访问顺序。

ANSI Serializable、ANSI Repeatable Read 和 GBase 8s Repeatable Read 隔离
如果需要 ANSI Serializable 或 ANSI Repeatable Read,则提供单个称为 GBase 8s
Repeatable Read 的隔离级别。
这在逻辑上等同于 ANSI Serializable。
由于 ANSI Serializable
比 ANSI Repeatable Read 更有约束性,因此,当需要 ANSI Repeatable Read 时,可使用
GBase 8s Repeatable Read
(虽然 GBase 8s Repeatable Read 在此上下文中比所需的具有更强
的约束性)。
Repeatable Read 隔离级别要求数据库服务器在程序检测和访存的每行上都放置锁。对于普
通游标放置共享的,对于更新游标放置可提升的。在检测每一行时单独地放置锁。直到该
游标关闭或事务结束,才释放它们。
Repeatable Read 允许使用滚动游标的程序多次读取选择了的行,并确保在读取之间不修改
或删除它们。(SQL 编程 描述滚动游标。)没有更低的隔离级别保证行依然存在且在第
二次读取它们时保持不变。
Repeatable Read 隔离放置最多的锁且保持它们的时间最长。因此,它是降低并发最多的级
别。如果您的程序使用此隔离的级别,则请仔细考虑它放置多少锁,保持它们多长时间,
以及对其他程序可产生哪些影响。
除了对并发的影响,大量的锁还可是个问题。数据库服务器在锁定表中,按每一程序记录
锁的数目。如果超出锁的最大数目,则锁表填满,且数据库服务器不可放置锁。返回一错
误代码。管理 GBase 8s 数据库服务器系统的人员可检测该锁定表,并当过度使用它时通
知您。
在缺省情况下,
在符合 ANSI 的数据库中,
将隔离界别设置为 Serializable。
需要 Serializable
隔离级别来确保根据 SQL 的 ANSI 标准执行操作。