返回首页

gbase数据、南大通用产品文档:GBase8c执行计划

更新日期:2024年09月11日

以如下SQL 语句为例:
SELECT * FROM t1, t2 WHERE t1.c1 = t2.c2;
执行EXPLAIN 的输出为:
执行计划层级解读(纵向):
(1)
第一层:Seq Scan on t2

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
537
表扫描算子,用Seq Scan 的方式扫描表t2。这一层的作用是把表t2 的数据从buffer 或
者磁盘上读上来输送给上层节点参与计算。
(2)
第二层:Hash
Hash 算子,作用是把下层计算输送上来的算子计算hash 值,为后续hash join 操作做数
据准备。
(3)
第三层:Seq Scan on t1
表扫描算子,用Seq Scan 的方式扫描表t1。这一层的作用是把表t1 的数据从buffer 或
者磁盘上读上来输送给上层节点参与hash join 计算。
(4)
第四层:Hash Join
join 算子,主要作用是将t1 表和t2 表的数据通过hash join 的方式连接,并输出结果数
据。
执行计划中的关键字说明:
(1)
表访问方式

Seq Scan
全表顺序扫描。

Index Scan
优化器决定使用两步的规划:
最底层的规划节点访问一个索引,
找出匹配索引条件的行
的位置,
然后上层规划节点真实地从表中抓取出那些行。
独立地抓取数据行比顺序地读取它
们的开销高很多,
但是因为并非所有表的页面都被访问了,
这么做实际上仍然比一次顺序扫
描开销要少。使用两层规划的原因是,上层规划节点在读取索引标识出来的行位置之前,会
先将它们按照物理位置排序,这样可以最小化独立抓取的开销。
如果在WHERE 里面使用的好几个字段上都有索引,那么优化器可能会使用索引的
AND 或OR 的组合。但是这么做要求访问两个索引,因此与只使用一个索引,而把另外一
个条件只当作过滤器相比,这个方法未必是更优。
索引扫描可以分为以下几类,他们之间的差异在于索引的排序机制。

Bitmap Index Scan
使用位图索引抓取数据页。

Index Scan using index_name

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
538
使用简单索引搜索,
该方式表的数据行是以索引顺序抓取的,
这样就令读取它们的开销
更大,但是这里的行少得可怜,
因此对行位置的额外排序并不值得。
最常见的就是看到这种
规划类型只抓取一行,以及那些要求ORDER BY 条件匹配索引顺序的查询。因为那时候没
有多余的排序步骤是必要的以满足ORDER BY。
(2)
表连接方式

Nested Loop
嵌套循环,适用于被连接的数据子集较小的查询。在嵌套循环中,外表驱动内表,外表
返回的每一行都要在内表中检索找到它匹配的行,
因此整个查询返回的结果集不能太大
(不
能大于10000)

要把返回子集较小的表作为外表,
而且在内表的连接字段上建议要有索引。

(Sonic) Hash Join
哈希连接,适用于数据量大的表的连接方式。
优化器使用两个表中较小的表,
利用连接
键在内存中建立hash 表,然后扫描较大的表并探测散列,找到与散列匹配的行。Sonic 和非
Sonic 的Hash Join 的区别在于所使用hash 表结构不同,不影响执行的结果集。

Merge Join
归并连接,通常情况下执行性能差于哈希连接。如果源数据已经被排序过,在执行融合
连接时,并不需要再排序,此时融合连接的性能优于哈希连接。
(3)
运算符

sort
对结果集进行排序。

filter
EXPLAIN 输出显示WHERE 子句当作一个“filter”条件附属于顺序扫描计划节点。这
意味着规划节点为它扫描的每一行检查该条件,
并且只输出符合条件的行。
预计的输出行数
降低了,因为有WHERE 子句。不过,扫描仍将必须访问所有10000 行,因此开销没有降
低;
实际上它还增加了一些
(确切的说,
通过10000 * cpu_operator_cost)
以反映检查WHERE
条件的额外CPU 时间。

LIMIT
LIMIT 限定了执行结果的输出记录数。
如果增加了LIMIT,
那么不是所有的行都会被检
索到。

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

GBA-01BR-0083
错误码
错误标识
错误显示信息
GBA-01BR-0083

remove tables from server Error
错误出现原因
从数据库中删除表旧数据失败
分析与建议
检查数据库结构的完整性及文件系统的状态和权限

取值:[0,86400]
默认值:30
说明:全局连接池使用,控制gbase_ping 操作超时时间。
修改方式:可在配置文件中修改值。适用于global 范围。