当前位置:网站首页>PG优化篇--执行计划相关项
PG优化篇--执行计划相关项
2022-08-05 10:51:00 【51CTO】
ENABLE_*参数
在PostgreSQL中有一些以“ENABLE_”开头的参数,这些参数提供了影响查询优化器选择不同执行计划的方法。有时,如果优化器为特定查询选择的执行计划并不是最优的,可以设置这些参数强制优化器选择一个更好的执行计划来临时解决这个问题。一般不会在PostgreSQL中配置来改变这些参数值的默认值,因为通常情况下,PostgreSQL不会走错执行计划。PostgreSQL走错执行计划是统计信息收集得不及时导致的,可通过更频繁地运行ANALYZE来解决这个问题,使用“ENABLE_”只是一个临时的解决方法。
cost基准值参数
执行计划在选择最优路径时,不同路径的cost值只有相对意义,同时缩放它们将不会对不同路径的选择产生任何影响。默认情况下,它们以顺序扫描一个数据块的开销作为基准单位,也就是说,将顺序扫描的基准参数“seq_page_cost”默认设为“1.0”,其他开销的基准参数都对照它来设置。从理论上来说也可以使用其他基准方法,如以毫秒计的实际执行时间作基准,但这些基准方法可能会更复杂一些。
COST基准值参数
在上面的配置项中,“seq_page_cost”一般作为基准,不用改变。可能需要改变的是“random_page_cost”,如果在读数据时,数据基本都命中在内存中,这时随机读和顺序读的差异不大,可能需要把“random_page_cost”的值调得小一些。如果想让优化器偏向走索引,而不走全表扫描,可以把“random_page_cost”的值调得低一些。
统计信息的收集
信息主要是AutoVacuum进程收集的,用于查询优化时的代价估算。表和索引的行数、块数等统计信息记录在系统表“pg_class”中,其他的统计信息主要收集在系统表“pg_statistic”中。而Stats Collector子进程是PostgreSQL中专门的性能统计数据收集器进程,其收集的性能数据可以通过“pg_stat_*”视图来查看,这些性能统计数据对数据库活动的监控及分析性能有很大的帮助。
统计信息收集器配置项
SQL执行的统计信息输出
可以使用以下4个boolean类型的参数来控制是否输出SQL执行过程的统计信息到日志中:
·log_statement_stats。
·log_parser_stats。
·log_planner_stats。
·log_executor_stats。
参数“log_statement_stats”控制是否输出所有SQL语句的统计信息,其他的参数控制每个SQL命令是否输出不同执行模块中的统计信息
手动收集统计信息
手动收集统计信息的命令是ANALYZE命令,此命令用于收集表的统计信息,然后把结果保存在系统表“pg_statistic”中。优化器可以使用收集到的统计信息来确定最优的执行计划。
在默认的PostgreSQL配置中,AutoVacuum守护进程是打开的,它能自动分析表、收集表的统计信息。当AutoVacuum进程关闭时,需要周期性地,或者在表的大部分内容变更后运行ANALYZE命令。准确的统计信息能帮助优化器生成最优的执行计划,从而改善查询的性能。比较常用的一种策略是每天在数据库比较空闲的时候运行一次VACUUM和ANALYZE命令。
ANALYZE命令的语法格式如下:
ANALYZE [ VERBOSE ] [ table [ ( column [, ...] ) ] ]
命令中的选项说明如下。
·VERBOSE:增加此选项将显示处理的进度以及表的一些统计信息。
·table:要分析的表名,如果不指定,则对整个数据库中的所有表进行分析。
·column:要分析的特定字段的名称。默认分析所有字段。
ANALYZE命令的应用示例
分析表“test01”中的“id1”和“id2”两个列
分析表“test01”中的所有列
ANALYZE命令只需在表上加一个读锁,因此它可以与表上的其他SQL命令并发执行。ANALYZE命令会收集表的每个字段的直方图和最常用数值的列表。
对于大表,ANALYZE命令只读取表的部分内容做一个随机抽样,不读取表的所有内容,这样就保证了即使是在很大的表上也只需要很少时间就可以完成统计信息的收集。统计信息只是近似的结果,即使表内容实际上没有改变,运行ANALYZE命令后EXPLAIN命令显示的执行计划中的COST值也会有一些变化。为了增加所收集的统计信息的准确度,可以增大随机抽样比例,这可以通过调整参数“default_statistics_target”来实现,该参数可在session级别设置,比如在分析不同的表时设置不同的值。在下面的示例中,假设表“test01”的行数较少,设置“default_statistics_target”为“500”,然后分析test01表,表“test02”行数较多,设置“default_statistics_target”为“10”,再分析test02表,命令如下:
也可以直接设置表的每个列的统计target值
ANALYZE命令的一个统计项是估计出现在每列的不同值的数目。仅仅抽样部分行,该统计项的估计值有时会很不准确,为了避免因此导致差的查询计划,可以手动指定这个列有多少个唯一值,其命令是“ALTER TABLE...ALTER COLUMN...SET (n_distinct=...)”,示例如下:
另外,如果表是有继承关系的其他子表的父表,还可以设置“n_distinct_inherited”,这样子表会继续父表的设置值,示例如下:
边栏推荐
- 2022 Hangzhou Electric Power Multi-School Session 6 1008.Shinobu Loves Segment Tree Regular Questions
- Our Web3 Entrepreneurship Project, Yellow
- 多线程(进阶) - 2.5w字总结
- 微服务结合领域驱动设计落地
- SkiaSharp 之 WPF 自绘 投篮小游戏(案例版)
- 【AGC】增长服务1-远程配置示例
- Nature:猪死亡1小时后,器官再次运转
- API 网关简述
- MMDetection in action: MMDetection training and testing
- 智能算力的枢纽如何构建?中国云都的淮海智算中心打了个样
猜你喜欢
The host computer develops C# language: simulates the STC serial port assistant to receive the data sent by the microcontroller
High-quality DeFi application building guide to help developers enjoy DeFi Summer
数据可视化(二)
登录功能和退出功能(瑞吉外卖)
linux下oracle常见操作以及日常积累知识点(函数、定时任务)
abc262-D(dp)
张朝阳对话俞敏洪:一边是手推物理公式,一边是古诗信手拈来
《分布式云最佳实践》分论坛,8 月 11 日深圳见
Login function and logout function (St. Regis Takeaway)
多线程(进阶) - 2.5w字总结
随机推荐
【加密解密】明文加密解密-已实现【已应用】
Is digital transformation a business buy-in?
In-depth understanding of timeout settings for Istio traffic management
How OpenHarmony Query Device Type
This notebook of concurrent programming knowledge points strongly recommended by Ali will be a breakthrough for you to get an offer from a big factory
双因子与多因子身份验证有什么区别?
Latex如何控制表格的宽度和高度
GPU-CUDA-图形渲染分析
第八章:activiti多用户任务分配
【AGC】增长服务1-远程配置示例
自定义过滤器和拦截器实现ThreadLocal线程封闭
Voice-based social software development - making the most of its value
Ali's new launch: Microservices Assault Manual, all operations are written out in PDF
第五章:activiti流程分流判断,判断走不同的任务节点
Where is your most secretive personality?
[Android] How to use RecycleView in Kotlin project
FPGA: Use of the development environment Vivado
阿里全新推出:微服务突击手册,把所有操作都写出来了PDF
SMB + SMB2: Accessing shares return an error after prolonged idle period
poj2287 Tian Ji -- The Horse Racing(2016xynu暑期集训检测 -----C题)