返回首页

gbase数据、南大通用产品文档:GBase8a拉链表性能优化

更新日期:2024年09月11日

优化场景
长期数据积累导致某表enddate=’29991231’的数据分布离散,存储在不同的DC
中,过滤时需要把所有含这部分数据的全部DC 打开(读入内存、解压、抽取),
时间及资源开销较大,进而造成作业性能较差;
拉链步骤中已有数据闭链及新数据开链都需要过滤表条件enddate=’29991231’。
某表n1 分片,
全部数据
(行数约为1.8 亿)
有2841 个DC,
但enddate =’29991231’

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1323
的数据(行数约为80 万)分布在2726 个DC 上,这导致智能索引的过滤效果很
差。
检查方法
通过GNode Trace 发现查询性能较慢,
在Trace 文件中,
Smart Scan 部分found DC
的个数很多,
而Scan 的结果行数却较少,
此时可以确定过滤后的数据离散的分布
在多个DC 中,以此判断是否需要进行数据整理调优。
优化方法
每个月整理表数据,将enddate=’29991231’的数据作为新数据集中插入到尾部,
减少数据分布离散度,原数据delete。
每半年对表数据进行重组(Shrink Space),释放delete 空间。
优化操作步骤
UPDATE p SET enddate=’29990000’ WHERE enddate=’29991231’;
INSERT
p
SELECT
col1,…colx,
’29991231’
FROM
p
WHERE
enddate=’29990000’ ;
DELETE FROM p_00ccard_ambs WHERE enddate=’29990000’;

所有 onstat 输出都包含一个头。onstat - 命令仅显示输出头,该命令返回的值指示数据库
服务器方式。
语法:

头具有以下格式:
Version--Mode (Type)--(Checkpnt)--Up Uptime--Sh_mem Kbytes
Version
是产品名和版本号
Mode
是当前的运行方式
(Type)
如果数据库服务器使用高可用性数据复制,那么指示类型是主还是辅助
如果数据库服务器不涉及数据复制,那么此字段不出现。如果类型为主,那么显示值 P 。
如果类型是辅助,那么显示值 S 。
(Checkpnt)
是 checkpoint 标志
如果设置,那么头可能在方式后面显示两个其他字段(如果时间设置是正确的话):
(CKPT REQ)
指示用户线程已请求检查点
(CKPT INP)
指示 checkpoint 在进行中。
在 checkpoint 过程中,
将访问限制为只读。
数据库服务器直到
检查点结束才能写或更新数据

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 463 -
Uptime
指示数据库服务器已运行了多长时间
如果系统时间被手动修改成以前的时间,并且服务器启动时间比当前系统时间晚,那么
uptime 不可用。在此情况下,头输出 Uptime Unavailable 文本。
Sh_mem
是数据库服务器共享内存的大小(单位是千字节)
数据库服务器头的样本如下:
GBase 8s Version X.X.UC1--On-Line--Up 15:11:41--9216 Kbytes
如果数据库服务器已阻塞,那么 onstat 头的输出包含额外的行。有关该行的状态码信息,
请参阅 监视数据库服务器状态。
返回码
当退出 onstat 实用程序时,会显示一些有用的码。请参阅 退出 onstat 实用程序时的返回
码。

dtcvasc() 函数将符合 ANSI SQL 标准的 DATETIME 值的字符串转换为
datetime 值。
要获取关于 ANSI SQL DATETIME 标准的信息,请参阅 DATETIME 和
INTERVAL 值的 ANSI SQL 标准。
语法
mint dtcvasc(inbuf, dtvalue)
char *inbuf;
dtime_t *dtvalue;
inbuf
指向包含 ANSI 标准 DATETIME 字符串的缓冲区的指针。
dtvalue
指向初始化的 datetime 变量的指针。

用法
您必须以您想要此变量拥有的限定符,来初始化 dtvalue 中的 datetime 变量。

inbuf 中的字符串必须有符合 year to second 限定符的值,该限定符的格式为 ANSI
SQL。
inbuf 字符串可有开头的和结尾的空格。
然而,
从第一个有效位至最后一个,
inbuf 仅
可包含符合 ANSI SQL 标准的 DATETIME 值的数字和定界符的字符。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 676 -
如果您指定年份值作为一个或两个数字,
则 dtcvasc() 函数假定该年份在当前世纪中。
您可设置该 DBCENTURY 环境变量来确定,当您省略来自该日期的世纪时,dtcvasc() 使
用哪个世纪。

如果该字符串为空字符串,则 dtcvasc() 函数将 dtvalue 指向的值设置为空。如果该
字符串是可接受的,则函数设置 datetime 变量中的值,并返回零。否则,函数保持该变量
不变,并返回负的错误代码。

返回代码
0
转换成功。
-1260
不可能在指定的类型之间转换。
-1261
在 datetime 或 interval 的第一个字段中数字太多。
-1262
在 datetime 或 interval 中的非数值字符。
-1263
在 datetime 或 interval 值中的字段超出范围或不正确。
-1264
在 datetime 或 interval 的末尾存在额外的字符。
-1265
在 datetime 或 interval 运算上发生溢出。
-1266
datetime 或 interval 值与该运算不兼容。
-1267
datetime 计算的结果超出范围。
-1268
参数包含无效的 datetime 限定符。
示例
demo 目录在 dtcvasc.ec 文件中包含此样例程序。
/*

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 677 -
* dtcvasc.ec *
The following program converts ASCII datetime strings in ANSI SQL format into datetime
(dtime_t) structure.
*/

#include

EXEC SQL include datetime;

main()
{
mint x;

EXEC SQL BEGIN DECLARE SECTION;
datetime year to second dt1;
EXEC SQL END DECLARE SECTION;

printf("DTCVASC Sample ESQL Program running.\n\n");

printf("Datetime string #1 = 2007-02-11 3:10:35\n");
if (x = dtcvasc("2007-02-11 3:10:35", &dt1))
printf("Result = failed with conversion error: %d\n", x);
else
printf("Result = successful conversion\n");

/*
* Note that the following literal string has a 26 in the hours place
*/
printf("\nDatetime string #2 = 2007-02-04 26:10:35\n");
if (x = dtcvasc("2007-02-04 26:10:35", &dt1))
printf("Result = failed with conversion error: %d\n", x);
else
printf("Result = successful conversion\n");

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

printf("\nDTCVASC Sample Program over.\n\n");
}
输出
DTCVASC Sample ESQL Program running.

Datetime string #1 = 2007-02-11 3:10:35
Result = successful conversion

Datetime string #2 = 2007-02-04 26:10:35
Result = failed with conversion error:-1263
DTCVASC Sample Program over.