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