返回首页

gbase数据、南大通用产品文档:GBase8sonmode、wm 和 AUTO_LRU_TUNING 参

更新日期:2024年09月11日

数:更改 LRU 调整状态(SQL 管理 API)
随同 admin() 或 task() 函数,使用 onmode、wm 和 AUTO_LRU_TUNING 参数来更改 LRU
调整状态而不更新 onconfig 文件。
语法

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 773 -


用法
使用 AUTO_LRU_TUNING=1 参数来启用自动的 LRU 调整。
使用 AUTO_LRU_TUNING=0 参数来禁用自动的 LRU 调整。
这个函数等同于 onmode -wm AUTO_LRU_TUNING 命令。
示例
下列示例启用自动的 LRU 调整:
EXECUTE FUNCTION task("onmode","wm","AUTO_LRU_TUNING=1");

删除 tenant 数据库
(SQL
管理 API)
随同 admin() 或 task() 函数,使用 tenant drop 参数来删除 tenant 数据库。
语法

元素
描述
关键考虑
database_name
tenant 数据库的名称。 必须是现有的 tenant 数据库。

用法

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 821 -

您必须拥有 DBA 权限或已被授予 TENANT 权限来运行这个命令。不可打开其他到该数
据库的连接。
删除该数据库中的表和数据。释放 tenant 数据库专用的存储空间。从 sysadmin 数据库中
的 tenant 表中移除数据库 tenant 属性。如果不与其他任何 tenant 数据库相关,则删除相
关的 tenant 虚拟处理器类。
下列语句删除 companyA tenant 数据库:
EXECUTE FUNCTION task('tenant drop', 'companyA');

FOREACH 循环以 FOREACH 关键字开始,并以 END FOREACH 结束。在 FOREACH
与 END FOREACH 之间,您可声明游标或使用 EXECUTE PROCEDURE 或 EXECUTE
FUNCTION。下图中的两个示例展示 FOREACH 循环的结构。
图: FOREACH 循环的结构。
FOREACH cursor FOR
SELECT column INTO variable FROM table
. . .
END FOREACH;

FOREACH
EXECUTE FUNCTION name() INTO variable;
END FOREACH;
下图创建使用 FOREACH 循环的例程来在 employee 表上操作。
图: 对 employee 表操作的 FROEACH 循环。
CREATE_PROCEDURE increase_by_pct( pct INTEGER )
DEFINE s INTEGER;

FOREACH sal_cursor FOR
SELECT salary INTO s FROM employee
WHERE salary > 35000
LET s = s + s * ( pct/100 );
UPDATE employee SET salary = s
WHERE CURRENT OF sal_cursor;
END FOREACH;

END PROCEDURE;
前图中的例程执行 FOREACH 内的这些任务:

声明游标

一次从 employee 表选择一个 salary 值

按百分率提高 salary

以新的 salary 更新 employee

访存下一个 salary 值

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

将 SELECT 语句放置在游标内,因为它返回表中所有大于 35000 的薪酬。
UPDATE 语句中的 WHERE CURRENT OF 子句仅更新该游标当前定位在其上的行,
并在
当前行上设置更新游标。更新游标在该行上放置更新锁,以便于其他用户不可更新该行,
直到您的更新发生为止。
如果 FOREACH 循环内的 UPDATE 或 DELETE 语句使用 WHERE CURRENT OF 子
句,则 SPL 例程将自动地设置更新游标。如果您使用 WHERE CURRENT OF,则必须显
式地引用 FOREACH 语句内的游标。如果您正在使用更新游标,则可在 FOREACH 语句
之前添加 BEGIN WORK 语句,并在 END FOREACH 之后添加 COMMIT WORK 语句,
如下图所示。
图: 自动地设置更新游标。
BEGIN WORK;
FOREACH sal_cursor FOR
SELECT salary INTO s FROM employee WHERE salary > 35000;
LET s = s + s * ( pct/100 );
UPDATE employee SET salary = s WHERE CURRENT OF sal_cursor
END FOREACH;
COMMIT WORK;
对于前图中 FOREACH 循环的每一迭代,需要新锁(如果您使用行级别锁定的话)。在
FOREACH 循环的最后迭代之后,COMMIT WORK 语句释放所有的锁(并将所有更新了
的行作为单个事务提交)。
要在循环的每一迭代之后提交更新了的行,您必须打开游标 WITH HOLD,并在
FOREACH 循环内包括 BEGIN WORK 和 COMMIT WORK 语句,如下列 SPL 例程那
样。
图: 在循环的每一迭代之后提交更新了的行。
CREATE PROCEDURE serial_update();
DEFINE p_col2 INT;
DEFINE i INT;
LET i = 1;
FOREACH cur_su WITH HOLD FOR
SELECT col2 INTO p_col2 FROM customer WHERE 1=1
BEGIN WORK;
UPDATE customer SET customer_num = p_col2 WHERE CURRENT
OF cur_su;
COMMIT WORK;
LET i = i + 1;
END FOREACH;

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

END PROCEDURE;
SPL 例程 serial_update() 提交每一行作为分开的事务。
对 FOREACH 循环的限制
在 FOREACH 循环内,SELECT 查询必须在更改该 SELECT 游标的数据集的任何
DELETE、INSERT 或 UPDATE 操作之前执行完成。确保 SELECT 查询完成的一种方式
是,在 SELECT 语句中使用 ORDER BY 子句。ORDER BY 子句在该列上创建索引,并
通过在同一 FOREACH 循环中更改 SELECT 语句的查询结果的 UPDATE、INSERT、
DELETE 语句来防止导致的错误。