资讯专栏INFORMATION COLUMN

Oracle2PG系列之管理SQL执行计划

IT那活儿 / 1129人阅读
Oracle2PG系列之管理SQL执行计划

点击上方“IT那活儿”,关注后了解更多精彩内容!!!


 前   言 

在我们日常运维过程中或多或少都会碰到SQL执行计划突变的问题,应急性解决方案基本都绕不开固定执行计划,Oracle也提供了丰富的工具outline、coe等。在我们最近的老案例Oracle迁移PG中,测试也发现了部分SQL在PG库中的执行计划性能较差,由于应用迁移工期紧以及程序代码繁多SQL逻辑层改造成本大,最终使用pg_show_plans与pg_hint_plan这2个社区插件在数据库层调整执行计划解决SQL性能问题。今天我们就来总结一下。


执行计划 

首先PG原生提供了explain命令来查看SQL执行计划,但是这个工具不能查看正在执行的SQL执行计划,这点非常不人性化。而我们根据query text重新构造SQL不仅费时而且DML语句还容易引起误操作。索性社区提供了插件pg_show_plans这个插件可以帮助我们查询pg_stat_activity中正在执行的SQL执行计划,支持PG主流版本9.5~14。
具体文档以及安装这里不在过多赘述,可以参考:
https://github.com/cybertec-postgresql/pg_show_plans:
安装完成后,我们构建用户表50万行,类型表500万行,并使用uid进行关联 ,如下:
使用pg_show_plans进行观察pid:19405的会话。
图中plan字段就是实际的执行计划,内容相对简单,但还是能够看到关键信息关联条件以及tb_classinfo表的Filter条件、返回行数等。案例中就是tb_classinfo 表根据cid 4301211进行全表扫描过滤返回1行数据再与tb_userinfo关联查询,老司机一看就知道可以在tb_classinfo的cid字段创建索引。
建完索引后,效率提升还是很明显的。
接下来就来看如何绑定一个SQL的执行计划,这里社区插件也相对较多,我们采用pg_hint_plan。
具体可以参考下面的连接:
https://github.com/ossc-db/pg_hint_plan
继续使用上文的案例,我们在tb_classinfo的cid创建索引后SQL使用索引扫描,这里我们使用Hint改变执行计划。
使用Hint seqscan成功改变计划,我们便可以将此方式存入plan hint表固定这类SQL的执行计划。
注意在绑定时常量值可以使用?代替。
在计划绑定后,重新发起SQL查询,pg_show_plans插件成功捕获到该SQL并打印出执行计划是我们绑定的计划,在这个过程中我们发现计划存入plan table时没有标志为,且show_plans里的计划也没有提示来自于哪个plan table的绑定,这方面还不够友好。
另外Hint种类繁多具体可以参考文档这里就不再一一介绍,本文就到此为止!



本 文 原 创 来 源:IT那活儿微信公众号(上海新炬王翦团队)


分享

收藏

点赞

在看

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129668.html

相关文章

  • 开源|性能优化利器:数据库审核平台Themis的选型与实践

    摘要:正是存在问题,促使我们考虑引入数据库审核平台。的确,与很多互联网公司相比,数据库数十套的估摸并不是太大但与互联网类公司不同,类似宜信这类金融类公司对数据库的依赖性更大,大量的应用是重数据库类的,且其使用复杂程度也远比互联网类的复杂。 作者:韩锋 出处:DBAplus社群分享 Themis开源地址:https://github.com/CreditEaseDBA 拓展阅读:宜信开源|数...

    wenhai.he 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<