第41期吐槽:无法预测大查询剩余执行时间
文中参考文档点击阅读原文打开, 同时推荐2个学习环境:
1、懒人Docker镜像, 已打包200+插件:《最好的PostgreSQL学习镜像》
2、有web浏览器就能用的云起实验室: 《免费体验PolarDB开源数据库》
3、PolarDB开源数据库内核、最佳实践等学习图谱: https://www.aliyun.com/database/openpolardb/activity
第41期吐槽:无法预测大查询剩余执行时间
1、产品的问题点
世界上最痛苦的事情莫过于
打开了一个网页, 结果鼠标漏斗不停的转呀转(windows).
老板让你查询一下报表数据, 执行了1条SQL, 但是不知道它什么时候能跑完.
PG 无法预测大查询剩余执行时间
2、问题点背后涉及的技术原理
用户提交SQL后, 数据库经过parse, query rewrite, plan, execute几个阶段执行. 用户等待执行结果的返回.
执行过程并不知道跑到哪个NODE了, 已执行的NODE代价估算是多少, 花了多少时间? 还有哪些NODE没有执行, 分别的代价估算是多少, 预计还要花多久?
执行计划是什么, 当前执行到哪里了, 每个步骤花了多少时间, 扫描了多少条记录, 多少个数据块, IO时间多少, op CPU 多少. 还剩多少时间. 返回多少行, 已返回多少行, 花了多少时间.
《DB吐槽大会,第12期 - 没有自动成本校准器》
3、这个问题将影响哪些行业以及业务场景
通用
4、会导致什么问题?
当任务不可预期时, 无法对此作出正确的响应, 例如
报表类的业务, 每天2点开始跑报表, 早上8点老板们需要拿到报表结果进行重大决策, 现在是6点半, 报表还没跑完, 还剩多久能跑完? 8点前能不能跑完? 接下来应该怎么办?
5、业务上应该如何避免这个坑
《官人要杯咖啡吗? - PostgreSQL实时监测PLAN tree的执行进度 - pg_query_state - Oracle 兼容10046 - progress》
把代价因子参数校准为时间为标准, 这样就可以得到较为准确的单个SQL的执行时间. 方法如下:
《优化器成本因子校对 - PostgreSQL explain cost constants alignment to timestamp》
《优化器成本因子校对(disk,ssd,memory IO开销精算) - PostgreSQL real seq_page_cost & random_page_cost in disks,ssd,memory》
6、业务上避免这个坑牺牲了什么, 会引入什么新的问题
管理复杂度增加.
7、数据库未来产品迭代如何修复这个坑
通过执行计划的每个node的代价以及已执行的过程和代价(行选择性估算、代价 与 实际行选择性、耗费时间等对齐估算)进行校准, 估算剩余时间.
用户可配置
开关控制: 打开或关闭
阈值控制: 当代价大于多少的时候, 跟踪执行过程
社区可能在努力了, https://commitfest.postgresql.org/34/3142/ 当前支持打印progress的SQL, 信息非常分散, 就不能弄个统一的函数接口来查看吗? 举个例子拿到PID, 然后print_progress(pid)
:
create index, cluster, vacuum, vacuum full, pg_checksums, pg_verifybackup, copy, parallel
https://github.com/wulczer/pg-progress
《PostgreSQL 17 preview - 增加index vacuum 进度打印》
《PostgreSQL 17 preview - pg_stat_progress_copy Add progress reporting of skipped tuples during COPY FROM》
《PostgreSQL 17 preview - Add new parallel message type to progress reporting.》
《PostgreSQL 16 preview - Add support for progress reporting to pg_verifybackup》
《PostgreSQL 15 preview - 新增参数: log_startup_progress_interval , 支持打印startup进程长时间的恢复进度》
《PostgreSQL 14 preview - 活跃会话pg_stat_activity、进程进度条 pg_stat_progress* 、等待事件wait_event等 信息 从 pgstat 代码 拆出》
《PostgreSQL 14 preview - pg_stat_progress_copy增强 , COPY 导入数据支持进度监控 , 导入多少行, 排除多少行(where filter)》
《PostgreSQL 14 preview - 支持copy命令进度查询 - pg_stat_progress_copy》
《PostgreSQL long query progress 进度评估》
《PostgreSQL 13 preview - analyze progress report》
《PostgreSQL 12 preview - Add progress reporting for CREATE INDEX | CLUSTER and VACUUM FULL》
《PostgreSQL 12 preview - Add progress reporting to pg_checksums》
《PostgreSQL 12 preview - 支持列出 vacuum full, cluster 过程详情 pg_stat_progress_cluster》
《PostgreSQL 10.0 preview 功能增强 - SQL执行剩余时间 - 垃圾回收过程可视 pg_stat_progress_vacuum》
本期彩蛋-招商中,有需要的小伙伴可联系嵌入...
文章中的参考文档请点击阅读原文获得.
欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.
近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号: