返回首页

gbase数据、南大通用产品文档:GBase8c使用指导

更新日期:2024年09月11日

数据收集
(1)
打开数据收集。
1
设置ActiveSQL operator 信息相关参数:
enable_resource_track=on
resource_track_level=operator
enable_resource_record=on
resource_track_cost=10(默认值为100000)

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
423
resource_track_cost 需设置为小于需要收集的查询总代价,
满足条件的信息才能被收集。
Cgroups 功能正常加载。
2
信息收集:
执行业务查询语句。
查看实时收集数据:
select * from gs_wlm_plan_operator_history;
预期:满足resource_track_duration 和resource_track_cost 的作业被全量收集。
(2)
关闭数据收集。
1
设置ActiveSQL operator 信息相关参数:
enable_resource_track=off 或
resource_track_level=none 或
resource_track_level=query
2
执行业务查询语句。
等待三分钟之后查看当前节点上的数据:
select * from gs_wlm_plan_operator_info;
预期:所查表和视图无新增数据。
(3)
数据持久化保存。
1
设置ActiveSQL operator 信息相关参数:
enable_resource_track=on
resource_track_level=operator
enable_resource_record=on
resource_track_duration=0(默认值为60s)
resource_track_cost=10(默认值为100000)
resource_track_cost 需设置为小于需要收集的查询总代价,
满足条件的信息才能被收集。
Cgroups 功能正常加载。
2
执行业务查询语句。
等待三分钟之后查看当前节点上的数据:
select * from gs_wlm_plan_operator_info;

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
424
预期:满足resource_track_duration 和resource_track_cost 的作业被全量收集。
模型管理(系统管理员用户)
模型管理操作需要在数据库正常的状态下进行。
(1)
新增模型:
INSERT INTO gs_opt_model values('……');
示例:
INSERT INTO gs_opt_model values('rlstm', 'model_name', 'datname', '127.0.0.1', 5000, 2000, 1,
-1, 64, 512, 0 , false, false, '{S, T}', '{0,0}', '{0,0}', 'Text');
具体模型参数设置请参考GS_OPT_MODEL。
目前“template_name” 列只支持“rlstm”。
“datname” 列请和用于模型使用和训练的数据库保持一致,否则无法使用。
“model_name” 一列需要满足unique 约束。
其他参数设置见产品文档最佳实践部分。
(2)
修改模型参数:
UPDATE gs_opt_model SET = WHERE model_name =
;
(3)
删除模型:
DELETE FROM gs_opt_model WHERE model_name = ;
(4)
查询现有模型及其状态:
SELECT * FROM gs_opt_model;
模型训练(系统管理员用户)
(1)
配置/添加模型训练参数:参考模型管理(系统管理员用户)进行模型添加、模型参数
修改,来指定训练参数。
模型添加:
INSERT INTO gs_opt_model values('rlstm', 'default', 'postgres', '127.0.0.1', 5000, 2000, 1, -1,
64, 512, 0 , false, false, '{S, T}', '{0,0}', '{0,0}', 'Text');

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
425
训练参数更新:
UPDATE gs_opt_model SET = WHERE model_name =
;
(2)
前提条件为数据库状态正常且历史数据正常收集:
删除原有encoding 数据:
DELETE FROM gs_wlm_plan_encoding_table;
进行数据编码,需要指定数据库名:
SELECT gather_encoding_info('postgres');
开始训练:
SELECT model_train_opt('rlstm', 'default');
(3)
获取AI Engine 侧模型训练日志相对路径:
SELECT * FROM track_model_train_opt('rlstm', 'default');
模型预测
模型预测功能需在数据库状态正常、指定模型已被训练且收敛的条件下进行。
目前,模型训练参数的标签设置中需要包含“S”标签,explain 中才可显示“p-time”
预测值。
例:INSERT INTO gs_opt_model values('rlstm', 'default', 'postgres', '127.0.0.1', 5000, 1000, 1,
-1, 50, 500, 0 , false, false, '{S, T}', '{0,0}', '{0,0}', 'Text');
调用explain 接口:
explain (analyze on, predictor )
SELECT ...
预期结果:
例:Row Adapter
(cost=110481.35..110481.35 rows=100 p-time=99..182 width=100) (actual
time=375.158..375.160 rows=2 loops=1)
其中,“p-time”列为标签预测值。
其他功能
(1)
检查AiEngine 是否可连接:
gsql=# select check_engine_status('aiEngine-ip-address',running-port);

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
426
(2)
查看模型对应日志在AiEngine 侧的保存路径:
gsql=# select track_model_train_opt('template_name', 'model_name');

以下示例程序 thread_safe 显示如何跨线程使用游标。此程序的示例输出遵循此源
列表。
源列表
主线程开始名为 con1 的临界,
并在表 t 上声明一个游标。
然后打开游标并使 con1
连接休眠。主线程然后启动六个线程(threads_all() 函数的六个实例),调用 pthread_join()
DCE 等待线程完成它们的工作。
每个线程使用连接 con1,打开的游标来执行获取操作。在获取操作之后,程序使连
接休眠。线程以顺序方式使用连接 con1,因为一次只能有一个线程可以使用函数,每个线
程从 t 表读取下一个记录。
/* **************************************************************
* Program Name: thread_safe()
*
* purpose : If a server connection is initiated with the WITH
* CONCURRENT TRANSACTION clause, an ongoing transaction
* can be shared across threads that subsequently
* connect to that server.
* In addition, if an open cursor is associated with such
* connection, the cursor will remain open when the
* connection
* is made dormant. Therefore, multiple threads can share a
* cursor.
*
* Methods : - Create database db_con221 and table t1.
* - Insert 6 rows into table t1, i.e. values 1 through 6.
* - Connect to db_con221 as con1 with CONCURRENT
* TRANSACTION.
* The CONCURRENT TRANSACTION option is required
since
* all
* threads use the cursor throughout the same
* connection.
* - Declare c1 cursor for "select a from t1 order by a".
* - Open the cursor.
* - Start 6 threads. Use DCE pthread_join() to determine if

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 400 -
* all threads complete & all threads do same thing as
* follows.
* For thread_1, thread_2, ..., thread_6:
* o SET CONNECTION con1
* o FETCH a record and display it.
* o SET CONNECTION con1 DORMANT
* - Disconnect all connections.
**************************************************************
*/

#include
#include

/* global definitions */
#define num_threads 6

/* Function definitions */
static void thread_all();
static long dr_dbs();
static int checksql(char *str, long expected_err, char *con_name);
static void dce_err();

/* Host variables declaration */
EXEC SQL BEGIN DECLARE SECTION;
char con1[] = "con1";
EXEC SQL END DECLARE SECTION;

/* ****************************************************
* Main Thread
******************************************************/
main()
{
/* create database */

EXEC SQL create database db_con221 with log;
if (! checksql("create database", 0, EMPTYSTR))
{
printf("MAIN:: create database returned status {%d}\n", SQLCODE);
exit(1);
}

EXEC SQL create table t1( sales int);
if (! checksql( "create_table", 0, EMPTYSTR))
{
dr_dbs("db_con221");
printf("MAIN:: create table returned status {%d}\n", SQLCODE);
exit(1);
}


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 401 -
if ( populate_tab() != FUNCSUCC)
{
dr_dbs("db_con221");
printf("MAIN:: returned status {%d}\n", SQLCODE);
exit(1);
}

EXEC SQL close database;
checksql("[main] ", 0, EMPTYSTR);

/* Establish connection 'con1' */
EXEC SQL connect to 'db_con221' as 'con1' WITH CONCURRENT
TRANSACTION;
if (! checksql("MAIN:: ", 0, EMPTYSTR))
{
dr_dbs("db_con221");
exit(1);
}

/* Declare cursor c1 associated with the connection con1 */
EXEC SQL prepare tabid from "select sales from t1 order by sales";
checksql("MAIN:: ", 0, EMPTYSTR);

EXEC SQL declare c1 cursor for tabid;
checksql("MAIN:: ", 0, EMPTYSTR);

/* Open cursor c1 and make the connection dormant */
EXEC SQL open c1;
checksql("MAIN:: ", 0, EMPTYSTR);
EXEC SQL set connection :con1 dormant;
checksql("MAIN:: ", 0, EMPTYSTR);

/* Start threads */
start_threads();

/* Close cursor and drop database */
EXEC SQL set connection :con1;
checksql("MAIN:: set connection", 0, EMPTYSTR);
EXEC SQL close c1;
checksql("MAIN:: ", 0, EMPTYSTR);
EXEC SQL free c1;
checksql("MAIN:: ", 0, EMPTYSTR);

EXEC SQL disconnect all;
checksql("MAIN:: disconnect all", 0, EMPTYSTR);
dr_dbs("db_con221");
} /* end of Main Thread */

/**********************************************************************

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 402 -
* Function: thread_all()
* Purpose : Uses connection con1 and fetches a row from table t1 using *
cursor c1.
* Returns : Nothing
**********************************************************************/
static void thread_all(thread_num)
int *thread_num;
{
EXEC SQL BEGIN DECLARE SECTION;
int val;
EXEC SQL END DECLARE SECTION;

/* Wait for the connection to become available */
do {
EXEC SQL set connection :con1;
} while (SQLCODE == -1802);

checksql("thread_all: set connection", 0, con1);

/* Fetch a row */
EXEC SQL fetch c1 into :val;
checksql("thread_all: fetch c1 into :val", 0, con1);

/* Free connection con1 */
EXEC SQL set connection :con1 dormant;
checksql("thread_all: set connection con1 dormant", 0, EMPTYSTR);
printf("Thread id %d fetched value %d from t1\n", *thread_num, val);
} /* thread_all() */

/**********************************************************************
* Function: start_threads()
* purpose : Create num_threads and passes a thread id number to each
* thread
**********************************************************************/

start_threads()
{

int thread_num[num_threads];
pthread_t thread_id[num_threads];
int i, ret, return_value;

for(i=0; i< num_threads; i++)
{
thread_num[i] = i;
if ((pthread_create(&thread_id[i], pthread_attr_default
(pthread_startroutine_t ) thread_all, &thread_num[i])) == -1)
{
dce_err(__FILE__, "pthread_create failed", (unsigned long)-1);

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 403 -
dr_dbs("db_con221");
exit(1);
}
}

/* Wait for all the threads to complete their work */
for(i=0; i< num_threads; i++)
{
ret = pthread_join(thread_id[i], (pthread_addr_t *) &return_value);
if(ret == -1)
{
dce_err(__FILE__, "pthread_join", (unsigned long)-1);
dr_dbs("db_con221");
exit(1);
}
}
} /* start_threads() */

/**********************************************************************
* Function: populate_tab()
* Purpose : insert values in table t1.
* Returns : FUNCSUCC on success and FUNCFAIL when it fails.
**********************************************************************/
static int
populate_tab()
{
EXEC SQL BEGIN DECLARE SECTION;
int i;
EXEC SQL END DECLARE SECTION;

EXEC SQL begin work;
if (!checksql("begin work", 0,EMPTYSTR))
return FUNCFAIL;
for (i=1; i<=num_threads; i++)
{
EXEC SQL insert into t1 values (:i);
if(!checksql("insert", 0,EMPTYSTR))
return FUNCFAIL;
}
EXEC SQL commit work;
if (!checksql("commit work", 0,EMPTYSTR))
return FUNCFAIL;

return FUNCSUCC;
} /* populate_tab() */

/**********************************************************************
* Function: dr_dbs()
* Purpose : drops the database.

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 404 -
**********************************************************************/
long dr_dbs(db_name)
EXEC SQL BEGIN DECLARE SECTION;
char *db_name;
EXEC SQL END DECLARE SECTION;

{
EXEC SQL connect to DEFAULT;
checksql("dr_dbs: connect", 0, "DEFAULT");

EXEC SQL drop database :db_name;
checksql("dr_dbs: drop database", 0, EMPTYSTR);

EXEC SQL disconnect all;
checksql("dr_dbs: disconnect all", 0, EMPTYSTR);
} /*dr_dbs() */

/**********************************************************************
* Function: checksql()
* Purpose : To check the SQLCODE against the expected error
* (or the expected SQLCODE) and issue a proper message.
* Returns : FUNCSUCC on success & FUNCFAIL on FAILURE.
**********************************************************************/
int checksql(str, expected_err, con_name)
char *str;
long expected_err;
char *con_name;
{
if (SQLCODE != expected_err)
{
printf( "%s %s Returned {%d}, Expected {%d}\n", str, con_name,
SQLCODE,
expected_err);
return(FUNCFAIL);
}
return (FUNCSUCC);
} /* checksql() */

/**********************************************************************
* Function: dce_err()
* purpose : prints error from dce lib routines
* return : nothing
**********************************************************************/

void dce_err(program, routine, status)
char *program, *routine;
unsigned long status;
{
int dce_err_status;

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 405 -
char dce_err_string[dce_c_error_string_len+1];

if(status == (unsigned long)-1)
{
dce_err_status = 0;
sprintf(dce_err_string, "returned FAILURE (errno is %d)", errno);
}
else
dce_error_inq_text(status, (unsigned char *)dce_err_string,
&dce_err_status);

if(!dce_err_status)
{
fprintf(stderr, "%s: error in %s:\n ==> %s (%lu) <==\n",
program, routine, dce_err_string, status);
}
else
fprintf(stderr, "%s: error in %s: %lu\n", program, routine, status);
} /* dce_err() */
输出
每次执行示例程序时,示例输出可能会出现不同,因为它取决于线程的执行顺序。
Thread id 0 fetched value 1 from t1
Thread id 2 fetched value 2 from t1
Thread id 3 fetched value 3 from t1
Thread id 4 fetched value 4 from t1
Thread id 5 fetched value 5 from t1
Thread id 1 fetched value 6 from t1
在此输出中,线程 1 获取表中最后一条记录。

STREAMING_CONT_QUERY
STREAMING_CONT_QUERY 系统表存储所有CONTVIEW 对象的元数据信息。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
829
名称
类型
描述
id
int4
CONTVIEW 对象唯一的标识符,不可重复。
type
char
标识CONTVIEW 的类型。
'c'表示该CONTVIEW 是基于列存存储模型。
'r'表示该CONTVIEW 是基于行存存储模型。
'p'表示该CONTVIEW 是基于分区列存存储模
型。
relid
oid
CONTVIEW 对象的OID。
defrelid
oid
CONTVIEW 对应的持续计算规则VIEW 的O
ID。
active
bool
标识CONTVIEW 是否处于持续计算状态。
t(true):表示是。
f(false):表示不是。
streamrelid
oid
CONTVIEW 对应的STREAM 的OID。
matrelid
oid
CONTVIEW 对应物化表的OID。
lookupidxid
oid
CONTVIEW 对应GROUP LOOK UP INDE
X 的OID,此字段内部使用,仅行存具有。
step_factor
int2
标识CONTVIEW 的步进模式。主要取值为0
(无重叠窗口)和1(滑动窗口,步长为1)。
ttl
int4
CONTVIEW 设置的ttl_interval 参数值。
ttl_attno
int2
CONTVIEW设置的TTL功能对应时间列的字
段编号。
dictrelid
oid
CONTVIEW 对应字典表的OID。
grpnum
int2
CONTVIEW 持续计算规则中维度列的个数,
此字段内部使用。
grpidx
int2vector
CONTVIEW 持续计算规则中维度列在TARG
ET LIST 的索引,此字段内部使用。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
830