南大通用GBase 8c集中式场景下SQL索引与优化

117 阅读4分钟

原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

在关系型数据库管理系统(RDBMS)中,性能优化一直是提升系统响应速度和处理效率的关键。对于GBASE这样的高性能数据库,优化查询效率不仅依赖于硬件配置、数据库设计,还在很大程度上依赖于SQL查询语句的编写以及索引的合理使用。本文将介绍通过添加、修改索引、调整SQL语句以及修改函数等来优化GBase 8c集中式性能的方法。

一: 添加索引以匹配SQL查询

索引是加速数据库查询的常用手段。一个合理的索引能够显著提升查询效率,尤其是对于复杂查询、聚合查询和关联查询等。通过添加索引,可以使SQL查询更加高效地利用数据库存储结构,从而提高执行速度。

在GBASE中,为了使索引匹配到SQL查询,首先要对查询的频繁使用字段进行分析。例如,如果查询中涉及了某个字段的条件过滤、排序或连接操作,则为该字段添加索引是一个优化的方案。

对于该语句,客户反馈严重超时,查看表ad_acc_entrie,发现该表有1.7亿条数据,表有77个字段。查看执行计划,走了顺序查找。

在该entrie_no字段上建立索引。

create index ad_acc_entrie_local_ad_acc_entrie_indx_5 on aes.ad_acc_entrie(entrie_no);

创建成功后,select语句响应时间降低到了ms级别。

二:根据SQL,添加索引改变执行计划的类型

索引中的字段不匹配或匹配度低时,可以采用修改索引字段或增加新索引等方式进行优化。

例如,考虑以下SQL查询,查询走的是索引查找,运行时间为1105ms

分析上面的执行计划,发现where条件中,只有extractdate字段匹配到了索引,走的是索引内的条件匹配。观察到batchno字段是in()结构,而且还遇到过in字段中的字符串多大500个的情况,所以对该字段单独创建了索引。

create index aesdeetailpart_is_aesfeedetail_batchno on aesdeetailpart(batchno) local;

分析上面的索引可以看到执行计划走了BitmapAnd,运行时间为123ms,效率提高了9倍。

三:修改SQL以优化查询

尽管索引是优化SQL查询的有效手段,但在某些情况下,索引并不能解决所有性能问题。如果通过添加或修改索引依然无法获得理想的查询性能,可以尝试修改SQL查询本身。常见的SQL优化技巧包括使用显式列选择而非SELECT *  、优化JOIN操作、使用子查询替代复杂的多表查询、合理使用LIMIT与OFFSET。

原始sql语句及执行计划,该执行计划需要耗时4101ms,仔细分析该执行计划,其实是Nested loop的两个值分别是234310 和234099,这两个数做嵌套循环导致了时间达到了2510ms,占了大部分时间

对该sql进行了重写如下,该计划也走了嵌套循环,但内外值分别是10和10,大幅度节省了时间。

这种方式通过限制返回的行数,可以显著提高查询的速度,特别是在分页查询的场景下。

四:观察sql语句,修改insert语句中的函数,提高插入效率

Insert 语句如下,可以看到该insert语句中使用了2次GEN_SERI_NO函数,根据10并发压测5分钟统计,该条语句平均执行时间是78ms。

查看函数GEN_SERI_NO的定义:

该函数中有commit、autonomous_transaction等,去掉这两个元素,又对函数中的2个sql进行了改写,修改后的函数:

重新对该sql进行10并发5分钟压测,该insert语句时间缩短到了5ms。

五:总结

GBase 8c集中式场景下的性能优化涉及多个方面,其中索引和SQL优化是两个重要的环节。通过添加合适的索引,使其能够有效匹配SQL查询,并根据SQL的特性调整索引结构,可以显著提升查询效率。此外,当索引无法解决性能问题时,适当修改SQL语句,以简化查询逻辑或调整查询结构,也能够有效改善数据库性能。掌握这些优化技巧,能够使GBASE在实际生产环境中更好地满足高效查询的需求。

原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。