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