返回首页

gbase数据、南大通用产品文档:GBase8sSPL 例程介绍

更新日期:2024年09月11日

SPL 例程 是包括 SPL 过程 和 SPL 函数 的一个广义术语。
SPL 过程是以 SPL 和 SQL
编写的不返回值的例程。SPL 函数是以 SPL 和 SQL 编写的返回单个值、复合数据类型
的值或多个值的例程。通常,以 SPL 编写的返回一个值的例程是 SPL 函数。
使用 SQL 和 SPL 语句来编写 SPL 例程。仅可在 CREATE PROCEDURE、CREATE
PROCEDURE FROM、CREATE FUNCTION 和 CREATE FUNCTION FROM 语句内使用
SPL 语句。使用诸如 GBase 8s ESQL/C 这样的 SQL API 都可用所有这些语句。使用
DB-Access 可用 CREATE PROCEDURE 和 CREATE FUNCTION 语句。
要在数据库中罗列所有 SPL 例程,请运行此命令,该命令创建和显示数据库的模式:
dbschema -d database_name -f all

本示例实现了使用SELECT
LAST_INSERT_ID()获取AUTO_INCREMENT 列的值

GBase 8a 程序员手册JDBC 篇


- 148 -

南大通用数据技术股份有限公司
示例如下:
package com.gbase.jdbc.simple;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SampleLastInsertID {



private
static
final
String
URL
=
"jdbc:gbase://192.168.111.95:5258/test?user=sysdba&password=";

public static void main(String[] args) {


try {



(new SampleLastInsertID()).test();


} catch (Exception ex) {



}

}


public void test() throws Exception {


Connection conn = null;


try {



Class.forName("com.gbase.jdbc.Driver").newInstance();



conn = DriverManager.getConnection(URL);




Statement stmt = null;



ResultSet rs = null;



try {




// 创建Statement 对象




stmt = conn.createStatement();

GBase 8a 程序员手册JDBC 篇
南大通用数据技术股份有限公司

- 149 -









// 创建表




stmt.executeUpdate("DROP
TABLE
IF
EXISTS
autoIncTutorial");




stmt.executeUpdate("CREATE TABLE autoIncTutorial ("






+ "priKey INT NOT NULL AUTO_INCREMENT, "






+
"dataField
VARCHAR(64),
PRIMARY
KEY
(priKey))");









// 插入一条数据





stmt.executeUpdate("INSERT
INTO
autoIncTutorial
(dataField) "






+ "values ('Can I Get the Auto Increment
Field?')");









// 使用LAST_INSERT_ID()获取自增一字段值




int autoIncKeyFromFunc = -1;




rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");




if (rs.next()) {





autoIncKeyFromFunc = rs.getInt(1);




} else {










}




rs.close();




System.out.println("Key returned from "






+
"'SELECT
LAST_INSERT_ID()':
"
+
autoIncKeyFromFunc);



} finally {




if (rs != null) {





try {






rs.close();





} catch (SQLException ex) {

GBase 8a 程序员手册JDBC 篇


- 150 -

南大通用数据技术股份有限公司












}




}




if (stmt != null) {





try {






stmt.close();





} catch (SQLException ex) {












}




}



}


} catch (SQLException ex) {



// 处理错误



System.out.println("SQLException: " + ex.getMessage());



System.out.println("SQLState: " + ex.getSQLState());



System.out.println("VendorError: " + ex.getErrorCode());


} finally {



conn.close();


}

}
}

使用 UPDATE STATISTICS 语句来更新系统目录信息,查询优化器用于对本地数
据库中对象上的操作。UPDATE STATISTICS 语句是对 SQL 的 ANSI/ISO 标准
的扩展。
语法

表和列作用域

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1141

元素
描述
限制
语法
column 表或同义词中的列 必须存在。带有 MEDIUM 或 HIGH
关键字,该列不可为 BYTE、
LVARCHAR 或 TEXT 数据类型。
标识符
owner
表或同义词的所有

必须是表或同义词的所有者
所有者名

synonym 要更新其统计信息
的表的同义词
在当前的数据库中,该同义词以
及它指向的表必须存在
标识符
table
要为其更新统计信
息的表
必须在当前的数据库中存在,或
为在当前会话中创建的临时表
标识符
用法
使用 UPDATE STATISTICS 语句来执行任何下列任务:

为表和表分片计算列值的分发。

更新数据库服务器用来优化查询的系统目录表。

强制重新优化 SPL 例程。

当您升级数据库服务器时,转换现有的索引。
请在不包含任何其他语句的事务中运行 UPDATE STATISTICS 语句。
如果您未指定表、例程以及 Resolution 子句,则 UPDATE STATISTICS 语句的
缺省作用域是当前数据库中所有永久表。(另请参阅主题 UPDATE STATISTICS
的作用域。)
在高可用性集群中的辅助服务器上,不支持 UPDATE STATISTICS 语句。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1142
限制: 在除了当前数据库之外的任何数据库中,您都不可更新表的或 UDR 的查
询计划的统计信息。也就是说,当执行 UPDATE STATISTICS 语句时,数据库服务
器忽略数据库对象。
UPDATE STATISTICS 的作用域
跟在 FOR TABLE 关键字或 FOR PROCEDURE 关键字之后的任何表、列或 SPL
例程都限制 UPDATE STATISTICS 的作用域。

如果 UPDATE STATISTICS 语句
o
未包括 Table 和 Column Scope 子句,且
o
无 Resolution 子句,且
o
无 FOR FUNCTION 规范,且
o
无 FOR PROCEDURE 规范,且
o
无 FOR ROUTINE 规范,且
o
无 FOR SPECIFIC 规范,
则在缺省情况下,对于当前数据库中的每个永久表,在 LOW 模式下更新
列分发统计信息,包括系统目录表。

如果您使用 FOR TABLE 关键字,但未指定表的名称或同义词,则数据
库服务器重新计算当前数据中所有表上的分发,以及您的会话中所有临时
表上的分发。(然而,UPDATE STATISTICS 对通过 CREATE
EXTERNAL TABLE 语句定义的对象不起作用。)

如果您在 FOR TABLE 关键字之后指定表,但没有指定列的列表,则数
据库服务器重新计算指定的表的所有列上的统计分发。

如果您包括 FOR PROCEDURE 关键字,但未指定任何 SPL 例程的名
称,则数据库服务器重新优化当前数据库中所有 SPL 例程的查询执行计
划。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1143
更新表的统计信息
虽然对数据库的更改可能使得 systables、syscolumns、sysindices、
sysfragments、sysdistrib 和 sysfragdist 系统目录表中的信息过时,但在大多数
SQL 语句之后,数据库服务器不自动地更新那些表。
在下列情况下,发出恰当的 UPDATE STATISTICS 语句来确保系统目录表中的列
分发信息反映数据库的当前状态:

您对表执行扩展的修改。

应用更改列值的分发。
UPDATE STATISTICS 语句刷新数据库服务器用于优化修改了的对象上的
查询的数据分发统计信息。

您以较新的数据库服务器为用户升级数据库。
UPDATE STATISTICS 语句将旧的索引转换为符合较新的数据库服务器索
引格式,并隐式地删除旧的索引。
您可逐个表地转换索引,也可一次转换整个数据库的索引。请遵循
GBase 8s 迁移指南 中的转换指南。
如果您的引用导致特定的表中数据的许多修改,则以 UPDATE STATISTICS 常规
地为那个表更新系统目录来提升查询效率。术语许多修改是相对于分发的分解。
如果数据修改对列值的分发几乎没有影响,则您不需要执行 UPDATE
STATISTICS。
NLSCASE INSENSITIVE 数据库中的分发统计信息
在以 NLSCASE INSENSITIVE 属性创建的数据库中,在列和 NCHAR 或
NVARCHAR 数据类型的表达式上的数据库服务器操作,在大写字母与小写字母
之间没有区别。在包括相同的字母序列但大小写不同的字符串的数据集中,与包
含相同的记录的区分大小写的数据库相比,生成 NCHAR 和 NVARCHAR 列的
数据分发需要较少的 bin。数据库服务器仅将所有大小写不同的值标识为单个的
不同值,并当它生成该列、索引或分片级统计信息时使用此结果。
要获取更多关于 NLSCASE INSENSITIVE 数据库的信息,请参阅 在 NLSCASE
INSENSITIVE 数据库中重复的行、指定 NLSCASE 区分大小写 和 在区分大小
写的数据库中的 NCHAR 和 NVARCHAR 表达式。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1144
自动化表统计信息维护
要简化 DBA 在维护当前的表统计信息中复杂的和重复的任务(查询优化器可从
其设计高效的查询计划) GBase 8s 提供表统计信息维护系统,称为“自动更新统
计信息”(AUS)。这可自动化对其统计信息陈旧的表的标识,并可自动化相应的
UPDATE STATISTICS 语句的构造和执行,以重新计算它们的列分发。当应该更
新表统计信息时,以内建的准则提供 AUS 系统,但 DBA 可修改这些准则来反
映当前的需要和工作负荷。
要获取更多信息,请参阅 GBase 8s 性能指南 中对“自动更新统计信息”维护系统
的描述。另请参阅 GBase 8s 管理员指南 中对 Scheduler 的描述,DBA 可用于
指定 AUS 系统以其重新计算表统计信息的政策、资源和频率。
在 GBase OpenAdmin Tool (OAT) for GBase 8s 中也可都得到对表统计信息的
AUS 维护系统。请参考 OAT 在线帮助,以获取关于如何配置 AUS 维护系统来
自动地提供当前表的统计信息的详细信息。
使用 FOR TABLE ONLY 关键字
使用 FOR TABLE ONLY 关键字来为 typed 表的层级之内单个表收集数据。当指
定的 table 有子表时,如果您没有紧跟在 FOR TABLE 之后包括 ONLY 关键
字,则 GBase 8s 为那个表以及为层级中它之下的每个子表创建分发。
例如,假设您的数据库有出现在 图 1 中的 typed 表层级, 展示名为 employee
的超级表有名为 sales_rep 的子表。反过来,sales_rep 表有名为
us_sales_rep 的子表。
图: typed 表层级的示例



GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1145
当执行下列语句时,数据库服务器生成关于 sales_rep 和 us_sales_rep 表的统
计信息:
UPDATE STATISTICS FOR TABLE sales_rep;
相反,下列示例为 sales_rep 中的每一列生成统计数据,但不处理表 employee 或
us_sales_rep:
UPDATE STATISTICS FOR TABLE ONLY (sales_rep);
如果你像在此示例中那样指定 FOR TABLE ONLY,则必须将表的标识符(或
owner.table)括在圆括号之间。
由于前面的示例都未指定更新统计数据的级别,因此在缺省情况下,数据库服务
器使用 LOW 模式。
更新列的统计信息
Table 和 Column Scope 规范还可包括一个或多个您想要为其计算统计分发的列的
名称。
在下列示例中,此语句计算 orders 表的三列的分发:
UPDATE STATISTICS FOR TABLE orders (order_num, customer_num,
ship_date);
如果您在 FOR TABLE 子句中未包括 column 名称,则使用 LOW、MEDIUM
或 HIGH 模式为指定的 table 的所有列计算分发,通过您请求的指定的或缺省的
Resolution 子句 percentage(对于 MEDIUM 或 HIGH 模式)表明 bin 的数目。
要了解对存储 UDT 的列上的 UPDATE STATISTICS 限制,另请参阅 更新用户
定义的类型的列的统计信息。
测试索引页
在 GBase 8s 中,当您在任何模式下执行 UPDATE STATISTICS 语句时,数据库
服务器通读索引页来:

为查询优化器计算统计信息

定位有标记为 1 的删除标记的页

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1146
如果找到带有标记为 1 的删除标记的页,则从 B 树清除程序列表移除相应的
键。
如果系统失败导致 B 树清除程序列表(存在于共享内存中)丢失,则此操作特别
有用。要移除那些已标记为删除了但还未从 B 树移除的 B 树项,请运行
UPDATE STATISTICS 语句。要获取关于 B 树清除程序列表的信息,请参阅您
的 GBase 8s 管理员指南。
更新用户定义的类型的列的统计信息
要计算更新用户定义的数据类型(UDT)的列的统计信息,您必须使用 UPDATE
STATISTICS MEDIUM FOR TABLE 语句或 UPDATE STATISTICS HIGH FOR
TABLE 语句。
不带有 MEDIUM 或 HIGH 关键字,UPDATE STATISTICS FOR TABLE 语句不
理会 UDT 列。
对 UDT 统计信息的限制
对于持有用户定义的数据类型的列,UPDATE STATISTICS 语句不收集
syscolumns 系统目录表的 colmin 和 colmax 列的值。
要删除存储用户定义的数据类型的值的列的分发统计信息,您必须在 LOW 模式
下执行 UPDATE STATISTICS,并包括 DROP DISTRIBUTIONS 关键字。
当您运行 UPDATE STATISTICS LOW FOR TABLE DROP DISTRIBUTIONS 语句
时,数据库服务器删除对应于该列的 tableid 和 colno 值的 sysdistrib 系统目录
表中的行。此外,数据库服务器移除可能为了指定的 opaque 列已创建了来存储
分发统计信息的任何大对象。
对 Opaque 列上统计信息的要求
UPDATE STATISTICS 可控制用户定义的 opaque 数据类型的列的统计信息,仅
当支持 statcollect( )、statprint( ) 的例程以及为该 UDT 定义的选择性函数。你
必须还持有对这些例程的 Usage 权限。
在有些情况下,如 SYSSBSPACENAME 配置参数指定的那样,UPDATE
STATISTICS 还需要 sbspace。要获取关于如何为其数据类型为 UDT 的列提供统

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1147
计数据的信息,请参考 GBase 8s DataBlade API 程序员指南。要获取关于
SYSSBSPACENAME 的信息,请参考您的 GBase 8s 管理员参考手册。
使用 FORCE 和 AUTO 关键字
您可可选地使用 FORCE 关键字或 AUTO 关键字来控制 UPDATE STATISTICS
语句的模式,当它更新系统目录中表和列的当前分发统计信息时。这些关键字仅
影响表和分片统计信息,在对例程统计信息的操作中是无效的。
如果您既省略 FORCE 关键字又省略 AUTO 关键字,则由 AUTO_STAT_MODE
配置参数的显式设置或缺省设置确定 UPDATE STATISTICS 对表和分片分发统计
信息的影响,除非设置 AUTO_STAT_MODE 会话环境变量来覆盖当前会话的那
个配置参数。
指定这些关键字之一仅影响当前的 UPDATE STATISTICS 操作。如果您尝试在同
一 UPDATE STATISTICS 语句中同时包括 FORCE 和 AUTO 关键字,则数据库
服务器发出异常。
重要: 数据库服务器收集的统计信息可能需要用于存储的 sbspace。通过运行
onspaces -c -S 命令创建 sbspace,并将配置参数 SYSSBSPACENAME 设置为该
sbspace 名称。如果未设置 SYSSBSPACENAME 配置参数,则数据库服务器可能不
能够存储指定的统计信息,因而 UPDATE STATISTICS 语句失败并报错 -9814,
"Invalid default sbspace name"。
FORCE 关键字
FORCE 关键字刷新指定范围内所有表和列的统计信息。如果启用 UPDATE
STATISTICS 语句的自动模式,则 FORCE 关键字覆盖自动模式,从而忽略 FOR
TABLE 规范的范围内的表和分片的 STATCHANGE 属性的值,就好像当前
UPDATE STATISTICS FORCE 操作的 AUTO_STAT_MODE 设置是 OFF 一
样。
下列语句指定 FORCE 关键字:
UPDATE STATISTICS FORCE;
此语句指导数据库服务器采取下列活动:

重新计算数据库中每个表的分发统计信息

重新优化每个用户定义的例程

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1148

将结果存储在系统目录中
包括 FORCE 关键字模仿 GBase 8s 数据库服务器 11.70 之前版本的先前的
UPDATE STATISTICS 行为。
AUTO 关键字
AUTO 关键字导致数据库服务器在自动模式下运行 UPDATE STATISTICS 语
句,但仅对于其统计信息丢失或陈旧的表和分片。不为其 STATCHANGE 值低于
指定阈值的表或分片刷新分发统计信息。
下列语句指定 AUTO 关键字:
UPDATE STATISTICS AUTO;
此语句指导数据库服务器采取下列行动:

重新为数据库中的每个表重新计算丢失的或陈旧的数据分发统计信息

重新优化每个用户定义的例程

将结果存储在系统目录中
对于某些表和表分片,当查询优化器已得到足够精确的现有的统计信息时,此选
项避免不必要的重新计算。在那种情况下,与对应的 UPDATE STATISTICS
FORCE 操作相比,UPDATE STATISTICS AUTO 操作需要更少的时间,又不损
害查询性能。
使用 LOW 模式选项
使用 UPDATE STATISTICS 语句的 LOW 选项来生成和更新关于 systables 系
统目录表中表、视图和页数统计信息的某些相关统计数据。如果您未指定任何模
式,则 LOW 模式是缺省的。
在 GBase 8s 中,对于 syscolumns 和 sysindexes 系统目录表中指定的列,LOW
模式还生成和更新某些索引和列统计信息。
LOW 模式生成关于该列的最少量的信息。如果您想要 UPDATE STATISTICS 语
句做极少的工作,则指定不是索引的一部分的列。不更新 syscolumns 中的
colmax 和 colmin 值,除非在该列上有索引。
下列示例更新 customer 表的 customer_num 列上的统计信息:
UPDATE STATISTICS LOW FOR TABLE customer (customer_num);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1149
由于 LOW 模式选项不更新 sysdistrib 系统目录表中的数据,因此所有与
customer 表相关联的分发保持不动,即使那些在 customer_num 列上已存在
的。
在 LOW 模式下采集 UPDATE STATISTICS 操作的索引统计信息期间,您可设
置 USTLOW_SAMPLE 配置参数或 SET ENVIRONMENT 语句的
USTLOW_SAMPLE 选项来启用采样。
使用 DROP DISTRIBUTIONS 选项
使用 DROP DISTRIBUTIONS 选项来强制从 sysdistrib 系统目录表移除分发信
息。
当您指定 DROP DISTRIBUTIONS 选项时,数据库服务器从您指定的一列或多列
移除现有的分发数据。如果您未指定任何列,则数据库服务器为那个表移除所有
分发数据。
您必须有 DBA 权限或是要使用此选项的表的所有者。
下列示例展示如何移除 customer 表中 customer_num 列的分发:
UPDATE STATISTICS LOW
FOR TABLE customer (customer_num) DROP DISTRIBUTIONS;
如该示例所示,您在更新 LOW 模式选项生成的统计信息的同时,删除该分发数
据。
使用 DROP DISTRIBUTIONS ONLY 选项
使用 DROP DISTRIBUTIONS ONLY 选项来从 sysdistrib 表移除分发信息,并为
其分发已被删除的那些表更新该系统目录中的 systables.version 列,而不收集任
何 LOW 模式表和索引统计信息。
如果您同时指定 DROP DISTRIBUTIONS ONLY 选项和 FOR TABLE 子句,则
GBase 8s 为 FOR TABLE 子句指定的 table 的列的集合(或为所有列,如果您未
提供 column 规范的话)移除现有的分发数据,但不收集任何 LOW 模式表和索
引统计信息。
您必须有 DBA 权限或是要使用此选项的表的所有者。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1150
下列示例移除 customer 表中 customer_num 列的分发:
UPDATE STATISTICS LOW
FOR TABLE customer (customer_num) DROP DISTRIBUTIONS ONLY;
当 ONLY 关键字不跟在 DROP DISTRIBUTIONS 关键字之后时,这会删除
customer.customer_num 分发信息,而不更新 LOW 模式选项生成的统计信息。
此示例从系统目录删除任何描述 sysdistrib 表的 customer.customer_num 的行,
并更新 systables 表中 customer 的 version 数目。不在 systables 上执行任何其
他 LOW 模式更新,因此通过此示例不更改 nrow 和 npused 列值,且不更新系
统目录的 syscolumns、sysfragments 和 sysindexes 表。在此示例中,LOW 关键
字不起作用,但在 MEDIUM 或 HIGH 模式中 DROP DISTRIBUTIONS ONLY
选项不可用。
由于它未指定 FOR TABLE 子句,因此下一示例从 sysdistrib 表删除所有行,
并为数据库中所有表更新系统目录中的 systables.version 列。
UPDATE STATISTICS DROP DISTRIBUTIONS ONLY;
使用 MEDIUM 模式选项
使用 MEDIUM 模式选项来更新与您可以 LOW 模式执行的相同的统计信息,并
还生成关于每一指定的列的数据值的分发的统计信息。
UPDATE STATISTICS MEDIUM 在表上已运行之后,查询优化器通常选择更为高
效的执行计划,这是与当对于该表仅获得 LOW 模式列分发统计信息时的同一
SELECT 语句相比。
数据库服务器将分发信息放置在 sysdistrib 系统目录表中,对于使用分布式存储
的分片的表,还放置在其他系统目录表中。
如果您使用 MEDIUM 模式选项,则数据库服务器至少扫描表一次,并在给定的
表上花费比 LOW 模式选项更长的执行时间。
当您使用 MEDIUM 模式选项时,通过采样数据行的百分率来获取数据分发,使
用您指定的统计信任级别,或缺省的信任级别 95%。您还可在 Resolution 子句中
指定一个显式的最小采样大小。由于 MEDIUM 采样大小通常远远小于实际的行
数,因此此模式比 HIGH 模式执行得更快。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1151
在通过采样获取的分发中,结果可多种多样,因为行的不同样例可有不同的采样
错误。如果结果差异很大,则您可使用 Resolution 子句来增加采样大小,或降低
percent,或增加 confidence 级别来获取更多一致的结果。
如果 Resolution 子句未指定每 bin 的采样的行的 percent,则在每一 bin 中样例
的缺省的平均百分率是 2.5,其将范围分为大约 40 个间隔。如果您未指定
confidence 级别的值,则缺省的级别是 0.95。此值可粗略地解释为 100 次中抽
取 95 次,在 MEDIUM 估计的值与来自 HIGH 分发的精确值之间在统计上没有
显著的差异。
然而,不为 LVARCHAR、BYTE 或 TEXT 列计算分发。
您必须有 DBA 权限或是该表的所有者来创建 MEDIUM 模式分发。要获取更多
关于 MEDIUM 和 HIGH 模式选项的信息,请参阅 Resolution 子句。
使用 HIGH 模式选项
使用 HIGH 模式选项来更新您可以 MEDIUM 模式选项计算的相同的统计信息。
UPDATE STATISTICS HIGH 与 UPDATE STATISTICS MEDIUM 之间的差异是
采样行的数目。
在 UPDATE STATISTICS MEDIUM 仅采样行的子集时,UPDATE STATISTICS
HIGH 基于通过 UPDATE STATISTICS 语句使用的信任和分辨率来扫描整个表。
对于已经获得每个列的 MEDIUM 模式分发统计信息的索引了的表,您在其为索
引键的一部分的每个列上运行 UPDATE STATISTICS HIGH 之后,查询优化器通
常选择更为高效的执行计划。
数据库服务器将分发信息放置在 sysdistrib 系统目录表中,对于使用分布式存储
的分片的表,还放置在其他系统目录表中。
如果您未指定 Resolution 子句,则分发给每个 bin 的数据的缺省百分率为