返回首页

gbase数据、南大通用产品文档:GBase8sifx_cl_card() 函数

更新日期:2024年09月11日

ifx_cl_card() 函数返回指定的集合类型主变量的基数。
语法
mint ifx_cl_card(collp, isnull)
ifx_collection_t *collp;
mint *isnull;
collp
指向应用程序中 collection 主变量的名称的指针。
isnull
如果该集合为空,则设置为 1,否则,设置为 0

用法
ifx_cl_card() 函数使得您能够确定集合中元素的数目、是否为空集合,以及集合是否
为空值。

返回代码
0
空集合。
>0
集合中元素的数目。
<0
发生错误。

示例

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 699 -
此样例程序在 demo 目录中的 ifx_cl_card.ec 文件中。
/*
* Check the cardinality of the collection variable when
* the data is returned from the server
*/

main()
{
exec sql begin declare section;
client collection myset;
exec sql end declare section;
mint numelems = 0;
mint isnull = 0;

exec sql allocate collection ::myset;
exec sql create database newdb;
exec sql create table tab (col set(int not null));
exec sql insert into tab values ("set{}");
exec sql select * into :myset from tab;
if ((ifx_cl_card(myset, &isnull) == 0) && isnull == 0)
printf("collection is empty\n");
else if ((ifx_cl_card(myset, &isnull) == 0) && isnull == 1)
printf("collection is null\n");
else if ((numelems = ifx_cl_card(myset, &isnull))> 0)
printf("number of elements is %d\n", numelems);
else
printf("error occurred\n");

exec sql update tab set col = ’set{1,2,3}’;
exec sql select * into :myset from tab;
if ((ifx_cl_card(myset, &isnull) == 0) && isnull == 0)
printf("collection is empty\n");


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 700 -
else if ((ifx_cl_card(myset, &isnull) == 0) && isnull == 1)
printf("collection is null\n");
else if ((numelems = ifx_cl_card(myset, &isnull))> 0)
printf("number of elements is %d\n", numelems);
else
printf("error occurred\n");

exec sql update tab set col = NULL;
exec sql select * into :myset from tab;
if ((ifx_cl_card(myset, &isnull) == 0) && isnull == 0)
printf("collection is empty\n");
else if ((ifx_cl_card(myset, &isnull) == 0) && isnull == 1)
printf("collection is null\n");
else if ((numelems = ifx_cl_card(myset, &isnull))> 0)
printf("number of elements is %d\n", numelems);
else
printf("error occurred\n");
}
输出
collection is empty
number of elements is 3
collection is null

ALTER AUDIT POLICY
功能描述
修改统一审计策略。
注意事项

只有poladmin、sysadmin 或初始用户用户才能进行此操作。

需要打开enable_security_policy 开关统一审计策略才可以生效,
开关打开方式请参
考《GBase 8c V5_3.0.0_开发者手册》中“25.29 安全配置”章节。
语法格式
ALTER AUDIT POLICY [ IF EXISTS ] policy_name { ADD | REMOVE }
{ [ privilege_audit_clause ] [ access_audit_clause ] };
ALTER AUDIT POLICY [ IF EXISTS ] policy_name MODIFY ( filter_group_clause );
ALTER AUDIT POLICY [ IF EXISTS ] policy_name DROP FILTER;
ALTER AUDIT POLICY [ IF EXISTS ] policy_name COMMENTS policy_comments;
ALTER AUDIT POLICY [ IF EXISTS ] policy_name { ENABLE | DISABLE };

privilege_audit_clause:
PRIVILEGES { DDL | ALL }

access_audit_clause:
ACCESS { DML | ALL }

filter_group_clause:
FILTER ON { ( FILTER_TYPE ( filter_value [, ... ] ) ) [, ... ] }
参数说明

policy_name
审计策略名称,需要唯一,不可重复。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
684
取值范围:字符串,要符合标识符的命名规范。

DDL
指的是针对数据库执行如下操作时进行审计,目前支持:CREATE、ALTER、DROP、
ANALYZE、
COMMENT、
GRANT、
REVOKE、
SET、
SHOW、
LOGIN_ANY、
LOGIN_FAILURE、
LOGIN_SUCCESS、LOGOUT。

ALL
指的是上述DDL 支持的所有对数据库的操作。

DML
指的是针对数据库执行如下操作时进行审计,目前支持:SELECT 、COPY 、
DEALLOCATE、DELETE、EXECUTE、INSERT、PREPARE、REINDEX、TRUNCATE、
UPDATE。

FILTER_TYPE
指定审计策略的过滤信息,过滤类型包括:IP、ROLES、APP。

filter_value
指具体过滤信息内容。

policy_comments
用于记录策略相关的描述信息。

ENABLE|DISABLE
可以打开或关闭统一审计策略。若不指定ENABLE|DISABLE,语句默认为ENABLE。
示例
请参考CREATE AUDIT POLICY 的示例。
相关命令
CREATE AUDIT POLICY,DROP AUDIT POLICY。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
685

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

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1315
通过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’;