当前位置:首页 > 报告详情

PostgreSQL执行计划精准调优基于disable_cost与pg_hint_plan的优化实践-杨向博.pdf

上传人: 茫然 编号:731587 2025-07-14 15页 1.72MB

1、PostgreSQLPostgreSQL执行计划精准调优执行计划精准调优基于disable_cost和pg_hint_plan的优化实践IvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论坛杨向博 PostgreSQL ACE颠覆认知的颠覆认知的L Limit t固执叛逆的固执叛逆的Hint t精确制导优化精确制导优化总结与展望总结与展望目录CONTENTSIvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论坛01.01.颠覆认知的颠覆认知的Lim

2、itLimitIvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论坛颠覆认知的颠覆认知的LimitLimitlimitlimit 1 1更慢?更慢?IvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论坛颠覆认知的颠覆认知的LimitLimitlimitlimit代价预估缺陷:未考虑数据分布,导致代价预估存在偏差,选择了实际不优的执行计划。代价预估缺陷:未考虑数据分布,导致代价预估存在偏差,选择了实际不优的执行计划。如图,紫色虚线表示扫描到预期数据的

3、耗时如图,紫色虚线表示扫描到预期数据的耗时IvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论坛00012300.511.522.533.5000123真实的数据分布真实的数据分布NUM0123450123456012345优化器假设的数据分布优化器假设的数据分布NUM1 https:/ http:/mysql.taobao.org/monthly/2025/01/07/02.02.固执叛逆的固执叛逆的HintHintIvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgr

4、eSQL高峰论坛高峰论坛固执叛逆的固执叛逆的HintHintHintHint 指定使用指定使用dba_users_username_idxdba_users_username_idx,实际走了,实际走了SeqScanSeqScan?IvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论坛固执叛逆的固执叛逆的HintHintdisable_costdisable_cost原理:原理:IvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论坛在讲具体hint

5、之前,介绍下set guc影响执行计划的原理。其实在内核中,是利用disable_cost来调整cost的计算。在costsize.c中,可以看到所有method对应的cost计算逻辑。Costdisable_cost=1.0e10;以set enable_indexscan to off 为例:在cost_index中当enable_indexscan为false时startup_cost+=disable_cost(10000000000)这样得到该indexscan的startup_cost会很大在后续优化器计算最小选择路径时,当前IndexScan会被排除3 https:/ metho

6、dmethod原理:原理:IvorySQL 2025IvorySQL 2025生态大会生态大会暨暨PostgreSQLPostgreSQL高峰论坛高峰论坛以IndexScan(table index.)为例:在set_rel_pathlist时进入hook,pg_hint_plan处理rel的indexlist,只保留hint中指定的index,从list中delete其他unused index并将indexscan之外其他的scan method配置为disable_cost最后计算最小代价,确定最终的path

word格式文档无特别注明外均可编辑修改,预览文件经过压缩,下载原文更清晰!
三个皮匠报告文库所有资源均是客户上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作商用。
本文主要内容是关于PostgreSQL执行计划的精准调优实践。关键点如下: 1. Limit查询的代价预估可能存在偏差,未考虑数据分布,导致选择了非最优执行计划。 2. 使用Hint进行优化时,通过设置`disable_cost`(一个极高的代价值),可以影响优化器的选择,但有时即使指定了Hint,由于代价预估问题,实际可能未走索引扫描,而是顺序扫描。 3. `pg_hint_plan`可以精确指导优化器使用特定索引,但需结合`disable_cost`改造为可调整的GUC参数,以实现精准打击,即精确制导优化。 4. 文中提及的优化器预估偏差是客观存在的,未来优化器和`pg_hint_plan`的能力需提升,并且可以通过结合AI技术来打造数据库智能体,提高数据库的可观测性和性能。 核心数据引用: - `disable_cost`的值为1.0e10(即10的10次方),用于增加非期望执行路径的成本,排除在优化器选择之外。 - 文章中通过示例说明了优化器假设的数据分布与真实数据分布之间的差异。
"Limit用法,你了解多少?" "PostgreSQL Hint真的准吗?" "如何智能优化PostgreSQL?"
客服
商务合作
小程序
服务号
折叠