认证培训专区
学习笔记
文章

在GBase c中,你可以通过哪些方式优化一条SQL语句?

发表于2026-06-17 12:10:1048次浏览12个评论

        在上一篇帖子《在GBase 8c中,一条SQL语句的生命周期是怎样的呢?》中,“查询重写/优化(CBO)”和“执行计划生成”两个步骤中,执行计划都是系统给的,当然有些时候可能不是最优的。那我们怎么手动优化这些执行计划那,我们可以从以下几个方面来入手:

计划名称计划关键字理解备注
Hash Join/*+ hashjoin(t1 t2)*/哈希连接两表间哈希匹配(源自网络)
Nested Loop Join/*+ nestloop(t1 t2)*/嵌套循环连接两表间都要扫描完(源自网络)
Merge Join/*+mergejoin(t1 t2)*/合并连接两表排序后合并(源自网络)
join顺序/*+ leading(t1 (t2 t3)) */     指定join默认表是先t1 join t2,可以指定先t2 join t3
指定行数 /*+ rows(t1 t2 #5) */指定行数行数可指定(#常量 +加 -减 *乘 )
指定扫描方式/*+ indexscan(t1 t1_id1_inx) */ 指定扫描方式可指定tablescan、indexscan、indexonlyscan
指定子链接块名/*+nestloop(t2 block1) */ 指定block显示指定block
指定custom plan/*+ use_cplan */ 指定custom planprepare创建cplan
指定generic  plan/*+ use_gplan */ 指定generic  planprepare创建gplan
指定子查询不扩展  /*+ no_expand */指定不扩展 不常用、不建议用

一、指定join方式

Hash Join、Nested Loop Join、Merge Join三种join的执行计划,同一个sql执行,使用不同的join方式cost值是不同的。

二、join顺序

explain select /*+ leading(t1 (t2 t3)) */ * from t1,t2,t3; 指定了先t2 join t3,再进行t1的join  。

三、指定行数

四、指定扫描方式

create index t1_id1_inx on t1 using btree (id1); #创建索引

explain select /*+ indexscan(t1 t1_id1_inx) */ * from t1,t2 where t1.id1 = t2.id2; 最重要的是指定了使用索引,在关系型数据库中,使用索引可以解决大部分查询慢的问题。

五、指定子链接块名

六、指定custom plan和generic  plan

七、指定子查询不扩展  

备注:

1、由于本次三个测试表的数据是一样的,实际中还是要根据表记录多少进行选择Plan,比如设置join表的先后顺序,设置join的类型,指定扫描行数,是否采用索引等。

2、不太理解block这区块是怎么来的。

 

 

评论

登录后才可以发表评论
GBase用户50900发表于 1个月前
干货满满,感谢楼主分享。
GBase用户51966发表于 1个月前
总结得很到位,学习。
GBase用户51511发表于 1个月前
写得真不错,赞一个!
佛洛伊得发表于 1个月前
总结得很到位,学习。
GBase用户51510发表于 1个月前
分析得很透彻,学习了。
塔山发表于 1个月前
非常实用的内容,收藏了。
一个老汉发表于 1个月前
写得真不错,赞一个!
用户头像
XX发表于 1个月前
感谢分享
用户头像
大力发表于 1个月前
干货满满,感谢楼主分享。
GBase用户21143发表于 1个月前
block这区块是怎么来的,想了下也没明白。
gbase0001发表于 1个月前
谢谢分享,总结得很到位
GBase用户51829发表于 1个月前
总结到位,已收藏