一、执行计划
1、解释
- 查询计划的结构是一棵树,由不同类型的节点组成。
- 最底层是扫描节点,用于从表中获取原始数据行。
- 如果需要对数据进行连接、聚合、排序等操作,在扫描节点之上会有相应的节点。
- EXPLAIN输出的每一行对应树中的一个节点,显示节点的类型和执行成本估算。
- 第一行是整个查询计划的估计总执行成本,优化器的目标就是最小化这个成本。
2、案例
t1=# explain select * from t3; QUERY PLAN -------------------------------------------------------- Seq Scan on t3 (cost=0.00..54.08 rows=1408 width=371) (1 row)
复制
-
估计的启动成本。这是在输出阶段开始之前所花费的时间,例如,在排序节点中进行排序的时间。
-
估计的总成本。这是在假设计划节点运行到完成的情况下得出的,即检索到所有可用行。
-
此计划节点估计输出的行数。同样,假设节点运行到完成。
-
该计划节点输出行的估计平均宽度(以字节为单位)。
-
成本是以规划器的成本参数确定的任意单位来衡量的。传统的做法是以磁盘页面获取的单位来衡量成本;也就是说,seq_page_cost通常设置为1.0,其他成本参数相对于该值进行设置。
-
上层节点的成本包括其所有子节点的成本
-
行数值不是计划节点处理或扫描的行数,而是节点发出的行数。这通常少于扫描的数目,因为在节点上应用的任何WHERE子句条件都会进行过滤。理想情况下,顶层行数估计值将接近查询实际返回、更新或删除的行数。
3、Cost值计算
计算1
t1=# SELECT relname, relpages FROM pg_class WHERE relname = 't3'; relname | relpages ---------+---------- t3 | 40 (1 row) t1=# SELECT pg_relation_size('t3') / 8192 AS pages; pages ------- 40 (1 row) t1=# select count(*) from t3; count ------- 1408 (1 row)
复制
t1=# explain select * from t3; QUERY PLAN -------------------------------------------------------- Seq Scan on t3 (cost=0.00..54.08 rows=1408 width=371) (1 row)
复制
t1=# show cpu_tuple_cost; cpu_tuple_cost ---------------- 0.01 (1 row) t1=# show seq_page_cost; seq_page_cost --------------- 1 (1 row)
复制
cost=(disk pages read * seq_page_cost) + (rows scanned * cpu_tuple_cost)=(401)+(14080.01)=40+14.08=54.08
计算2
t1=# explain select count(*) from t2; QUERY PLAN -------------------------------------------------------------------------------------- Finalize Aggregate (cost=25121.88..25121.89 rows=1 width=8) -> Gather (cost=25121.67..25121.88 rows=2 width=8) Workers Planned: 2 -> Partial Aggregate (cost=24121.67..24121.68 rows=1 width=8) -> Parallel Seq Scan on t2 (cost=0.00..23370.73 rows=300373 width=0) (5 rows)
复制
t1=# select count(*) from t2; count -------- 720896 (1 row) t1=# SELECT relname, relpages FROM pg_class WHERE relname = 't2'; relname | relpages ---------+---------- t2 | 20367 (1 row)
复制
- 第五行
(sequential_page_cost * pages) + (cpu_tuple_cost * tuples) = (1.0 * 20367) + (0.01 * 300373) = 20367 + 3003.73 = 23370.73
复制
- 第四行
startup_cost = child_startup_cost total_cost = child_total_cost + cpu_operator_cost * rows - child_startup_cost: 子节点的启动成本。 - child_total_cost: 子节点的总成本。 - cpu_operator_cost: 在每个元组(行)上执行聚合操作的 CPU 成本。 - rows: 估计需要处理的元组(行)数。
复制
t1=# show cpu_operator_cost; cpu_operator_cost ------------------- 0.0025 (1 row)
复制
startup_cost = 0.00 total_cost = 23370.73 + (0.0025 * 300373) = 23370.73 + 750.93 = 24121.66
复制
- 第二行
t1=# show parallel_setup_cost; parallel_setup_cost --------------------- 1000 (1 row)
复制
parallel_setup_cost = 1000.0 (默认值) Partial Aggregate 节点的成本范围: cost=24121.67..24121.68 cpu_tuple_cost = 0.01 (默认值) rows = 2 (估计需要处理的元组数)
复制
startup_cost = child_startup_cost + parallel_setup_cost total_cost = startup_cost + cpu_tuple_cost * rows
复制
startup_cost = 24121.67 + 1000.0 = 25121.67 total_cost = 25121.67 + (0.01 * 2) = 25121.67 + 0.02 = 25121.69
复制
最后修改时间:2024-03-29 17:50:35
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
postgresql执行计划中cost值计算。 。 。
1年前

评论
相关阅读
2025年3月中国数据库排行榜:PolarDB夺魁傲群雄,GoldenDB晋位入三强
墨天轮编辑部
1970次阅读
2025-03-11 17:13:58
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1322次阅读
2025-03-13 11:40:53
【专家观点】罗敏:从理论到真实SQL,感受DeepSeek如何做性能优化
墨天轮编辑部
1308次阅读
2025-03-06 16:45:38
DeepSeek R1助力,腾讯AI代码助手解锁音乐创作新
若城
1186次阅读
2025-03-05 09:05:00
06 HarmonyOS Next性能优化之LazyForEach 列表渲染基础与实现详解 (一)
若城
1145次阅读
2025-03-05 21:09:40
09 HarmonyOS NEXT 仿uv-ui Tag组件开发教程系列(三)
若城
1061次阅读
2025-03-06 22:06:10
08 HarmonyOS NEXT 仿uv-ui Tag组件开发教程系列(二)
若城
1059次阅读
2025-03-06 21:37:02
11 【HarmonyOS NEXT】 仿uv-ui组件开发之Avatar组件深度剖析(二)
若城
1056次阅读
2025-03-07 21:35:16
10 【HarmonyOS NEXT】 仿uv-ui组件开发之Avatar头像组件开发教程(一)
若城
1056次阅读
2025-03-07 21:10:59
07 HarmonyOS NEXT 仿uv-ui Tag组件开发教程系列(一)
若城
1049次阅读
2025-03-06 21:03:19