返回首页

gbase数据、南大通用产品文档:GBase8cQuery 执行流程

更新日期:2024年09月11日

SQL 引擎从接受SQL 语句到执行SQL 语句,
需要经历的步骤如图14-2 和表15-1 所示。
其中,红色字体部分为DBA 可以介入实施调优的环节。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
533
图14- 2 SQL 引擎执行查询类SQL 语句的流程
表14- 3 SQL 引擎执行查询类SQL 语句的步骤说明
步骤
说明
1、语法&词法解析
按照约定的SQL 语句规则,把输入的SQL 语句从字符串转化为
格式化结构(Stmt)。
2、语义解析
将“语法&词法解析”输出的格式化结构转化为数据库可以识别
的对象。
3、查询重写
根据规则把“语义解析”的输出等价转化为执行上更为优化的结
构。
4、查询优化
根据“查询重写”的输出和数据库内部的统计信息规划SQL 语句
具体的执行方式,也就是执行计划。统计信息和GUC 参数对查
询优化(执行计划)的影响,请参见调优手段之统计信息和调优
手段之GUC 参数。
5、查询执行
根据“查询优化”规划的执行路径执行SQL 查询语句。底层存储
方式的选择合理性,
将影响查询执行效率。
详见调优手段之底层
存储。
调优手段之统计信息

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
534
GBase 8c 优化器是典型的基于代价的优化(Cost-Based Optimization,简称CBO)。在
这种优化器模型下,
数据库根据表的元组数、
字段宽度、
NULL 记录比率、
distinct 值、
MCV
值、HB 值等表的特征值,以及一定的代价计算模型,计算出每一个执行步骤的不同执行方
式的输出元组数和执行代价(cost),进而选出整体执行代价最小/首元组返回代价最小的执
行方式进行执行。
这些特征值就是统计信息。
从上面的描述可以看出统计信息是查询优化的
核心输入,准确的统计信息将帮助规划器选择最合适的查询规划。一般来说我们会通过
ANALYZE 语法收集整个表或者表的若干个字段的统计信息,周期性地运行ANALYZE,或
者在对表的大部分内容做了更改之后马上运行ANALYZE。
调优手段之GUC 参数
查询优化的主要目的是为查询语句选择高效的执行方式。
如下SQL 语句:
select count(1)
from customer inner join store_sales on (ss_customer_sk = c_customer_sk);
在执行customer inner join store_sales 的时候,GBase 8c 支持Nested Loop、Merge Join
和Hash Join 三种不同的Join 方式。优化器会根据表customer 和表store_sales 的统计信息估
算结果集的大小以及每种join 方式的执行代价,然后对比选出执行代价最小的执行计划。
正如前面所说,
执行代价计算都是基于一定的模型和统计信息进行估算,
当因为某些原
因代价估算不能反映真实的cost 的时候,
我们就需要通过guc 参数设置的方式让执行计划倾
向更优规划。
调优手段之底层存储
GBase 8c 支持行存表、列存表,底层存储方式的选择严格依赖于客户的具体业务场景。
一般来说计算型业务查询场景(以关联、聚合操作为主)建议使用列存表;点查询、大批量
UPDATE/DELETE 业务场景适合行存表。
对于每种存储方式还有对应的存储层优化手段,这部分会在后续的调优章节深入介绍。
调优手段之SQL 重写
除了上述干预SQL 引擎所生成执行计划的执行性能外,
根据数据库的SQL 执行机制以
及大量的实践发现,
有些场景下,
在保证客户业务SQL 逻辑的前提下,
通过一定规则由DBA
重写SQL 语句,可以大幅度的提升SQL 语句的性能。
这种调优场景对DBA 的要求比较高,需要对客户业务有足够的了解,同时也需要扎实
的SQL 语句基本功,后续会介绍几个常见的SQL 改写场景。

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

功能描述
使用CALL 命令可以调用已定义的函数和存储过程。
注意事项
函数或存储过程的所有者、被授予了函数或存储过程EXECUTE 权限的用户或被授予
EXECUTE ANY FUNCTION 权限的用户有权调用函数或存储过程,系统管理员默认拥有此
权限。
语法格式
CALL [ schema. ] func_name ( param_expr );
参数说明

schema
函数或存储过程所在的模式名称。

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

param_expr
参数列表可以用符号“:=”或者“=>”将参数名和参数值隔开,
这种方法的好处是参数可以
以任意顺序排列。
若参数列表中仅出现参数值,
则参数值的排列顺序必须和函数或存储过程
定义时的相同。
取值范围:已存在的函数参数名称或存储过程参数名称。
说明:参数可以包含入参(参数名和类型之间指定“IN”关键字)和出参(参数
名和类型之间指定“OUT”关键字)
,使用CALL 命令调用函数或存储过程时,对于非重载
的函数,参数列表必须包含出参,出参可以传入一个变量或者任一常量,详见示例。对于重
载的package 函数,参数列表里可以忽略出参,忽略出参时可能会导致函数找不到。包含出
参时,出参只能是常量。
示例
--创建一个函数func_add_sql,计算两个整数的和,并返回结果。
gbase=#CREATE FUNCTION func_add_sql(num1 integer, num2 integer) RETURN integer
AS
BEGIN
RETURN num1 + num2;
END;
/
--按参数值传递。
gbase=#CALL func_add_sql(1, 3);
--使用命名标记法传参。
gbase=#CALL func_add_sql(num1 => 1,num2 => 3);
gbase=#CALL func_add_sql(num2 := 2, num1 := 3);

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
808
--删除函数。
gbase=#DROP FUNCTION func_add_sql;
--创建带出参的函数。
gbase=#CREATE FUNCTION func_increment_sql(num1 IN integer, num2 IN integer, res OUT
integer)
RETURN integer
AS
BEGIN
res := num1 + num2;
END;
/
--出参传入常量。
gbase=#CALL func_increment_sql(1,2,1);
--删除函数。
gbase=#DROP FUNCTION func_increment_sql;

语法
gs_dumpall [OPTION]...

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