当前位置: 首页 > news >正文

【PostgreSQL】AUTO_EXPLAIN - 慢速查询的日志执行计划

本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。

一、介绍

在本文中,我们将了解 PostgreSQL AUTO_EXPLAIN功能的工作原理,以及为什么应该使用它来收集在生产系统上执行的 SQL 语句的实际执行计划。

二、SQL执行计划

当您向 PostgreSQL 发送 SQL 语句时,该语句的执行方式如下图所示:

首先,基于文本的 SQL 语句被解析为可由数据库服务器以编程方式遍历的抽象语法树(例如查询树)。

其次,优化器使用查询树生成最佳执行计划,该执行计划消耗最少的资源来生成所需的结果。

第三,执行器运行执行计划,并将输出作为查询结果集返回给客户端。

三、估计执行计划和真实的执行计划

当您使用 EXPLAIN 命令时。 PostgreSQL 仅返回估计执行计划,即优化器认为对于所提供的 SQL 语句最有效的计划。但是,当您运行 EXPLAIN 命令时,该语句并未真正执行。

另一方面,如果我们运行 EXPLAIN ANALYZE,PostgreSQL 会运行该语句,因此我们将得到实际执行计划,其中还包含执行计划中每个操作的计时信息。

在研究生产系统上的慢速查询时,我们可能会面临几个挑战。

• 首先,出于安全原因,我们可能不允许在生产系统上运行查询,因此,在这种情况下,我们不能简单地运行 EXPLAIN ANALYZE 命令来获取实际执行计划。

• 其次,即使我们有权运行 EXPLAIN ANALYZE 命令,我们也可能会观察到与客户抱怨的计划不同的计划。这可能是由于几个原因造成的。

例如,PostgreSQL 有一个prepareThreshold 设置,其默认值为5。该值告诉PostgreSQL 在切换到使用通用计划的服务器端Prepared Statement 之前,它可以在客户端模拟Prepared Statement 多少次。

如果慢速查询使用通用计划,即使运行 EXPLAIN ANALYZE(它会动态生成执行计划),您也可能无法获得相同的计划。

因此,分析慢速查询的一个更好的解决方案是,我们获取 PostgreSQL 在运行相关查询时使用的实际执行计划。

四、Auto Explain 模块

PostgreSQL 是非常可定制的,它提供了几个我们可以显式激活的扩展。

auto_explain 就是这样的一个扩展,它允许我们捕获花费时间超过预定义阈值的 SQL 查询的实际执行计划。

auto_explain模块提供了一种自动记录执行计划的方法,而无需手动运行。这对于在大型应用程序中追踪未优化的查询特别有用。

该模块不提供SQL可访问的功能。要使用它,只需将其加载到服务器中。您可以将其加载到单个会话中:

您必须是超级用户才能执行此操作。更典型的用法是通过在 postgresql.conf 中的 session_preload_libraries 中包含 auto_explain 或 shared_preload_libraries 来将其预加载到部分或所有会话中。然后,无论查询何时发生,您都可以跟踪异常缓慢的查询。当然,这需要付出一定的管理费用。

4.1 安装

支持 PostgreSQL 版本 12 及更高版本。

在继续之前安装 PostgreSQL。确保有 pg_config 二进制文件,它们通常包含在 -dev 和 -devel 包中。

如果下载失败,可直接下载ZIP包上传解压安装

4.2 配置参数

有几个配置参数控制 auto_explain 的行为。请注意,默认行为是不执行任何操作,因此如果您想要任何结果,则必须至少设置 auto_explain.log_min_duration。

auto_explain.log_min_duration(整数)

auto_explain.log_min_duration 是将导致记录该语句的计划的最短语句执行时间(以毫秒为单位)。将其设置为 0 会记录所有计划。 -1(默认值)禁用计划记录。例如,如果将其设置为 250 毫秒,则将记录运行 250 毫秒或更长的所有语句。只有超级用户才能更改此设置。

auto_explain.log_parameter_max_length(整数)

auto_explain.log_parameter_max_length 控制查询参数值的记录。值为 -1(默认值)会完整记录参数值。 0 禁用参数值记录。大于零的值会将每个参数值截断为那么多字节。只有超级用户才能更改此设置。

auto_explain.log_analyze(布尔值)

auto_explain.log_analyze 会导致在记录执行计划时打印 EXPLAIN ANALYZE 输出,而不仅仅是 EXPLAIN 输出。该参数默认关闭。只有超级用户才能更改此设置。

注意:当此参数打开时,所有执行的语句都会按计划节点计时,无论它们运行的时间是否足够长以实际记录日志。这可能会对性能产生极其负面的影响。关闭 auto_explain.log_timing 可改善性能成本,但代价是获取的信息较少。

auto_explain.log_buffers(布尔值)

auto_explain.log_buffers 控制在记录执行计划时是否打印缓冲区使用统计信息;它相当于 EXPLAIN 的 BUFFERS 选项。除非启用 auto_explain.log_analyze,否则此参数无效。该参数默认关闭。只有超级用户才能更改此设置。

auto_explain.log_wal(布尔值)

auto_explain.log_wal 控制在记录执行计划时是否打印 WAL 使用统计信息;它相当于 EXPLAIN 的 WAL 选项。除非启用 auto_explain.log_analyze,否则此参数无效。该参数默认关闭。只有超级用户才能更改此设置。

auto_explain.log_timing(布尔值)

auto_explain.log_timing 控制在记录执行计划时是否打印每个节点的计时信息;它相当于 EXPLAIN 的 TIMING 选项。重复读取系统时钟的开销可能会显着减慢某些系统上的查询速度,因此当仅需要实际行计数而不是精确时间时,将此参数设置为关闭可能很有用。除非启用 auto_explain.log_analyze,否则此参数无效。该参数默认开启。只有超级用户才能更改此设置。

auto_explain.log_triggers(布尔值)

auto_explain.log_triggers 导致在记录执行计划时包含触发器执行统计信息。除非启用 auto_explain.log_analyze,否则此参数无效。该参数默认关闭。只有超级用户才能更改此设置。

auto_explain.log_verbose(布尔值)

auto_explain.log_verbose 控制在记录执行计划时是否打印详细信息;它相当于 EXPLAIN 的 VERBOSE 选项。该参数默认关闭。只有超级用户才能更改此设置。

auto_explain.log_settings(布尔值)

auto_explain.log_settings 控制在记录执行计划时是否打印有关修改的配置选项的信息。输出中仅包含影响查询计划且其值与内置默认值不同的选项。该参数默认关闭。只有超级用户才能更改此设置。

auto_explain.log_format(枚举)

auto_explain.log_format 选择要使用的 EXPLAIN 输出格式。允许的值为 text、xml、json 和 yaml。默认为文本。只有超级用户才能更改此设置。

auto_explain.log_level(枚举)

auto_explain.log_level 选择 auto_explain 将记录查询计划的日志级别。有效值为 DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、NOTICE、WARNING 和 LOG。默认为日志。只有超级用户才能更改此设置。

auto_explain.log_nested_statements(布尔值)

auto_explain.log_nested_statements 导致考虑记录嵌套语句(在函数内执行的语句)。当它关闭时,仅记录顶级查询计划。该参数默认关闭。只有超级用户才能更改此设置。

auto_explain.sample_rate(实数)

auto_explain.sample_rate 导致 auto_explain 仅解释每个会话中的一小部分语句。默认值为 1,表示解释所有查询。如果是嵌套语句,则要么全部解释,要么不解释。只有超级用户才能更改此设置。

在日常使用中,这些参数是在 postgresql.conf 中设置的,尽管超级用户可以在自己的会话中即时更改它们。典型用法可能是:

4.3 示例

1)创建扩展

2)窗口1执行以下查询

3)窗口2查看当前正在执行的SQL

可以看到PID=43144的进程,正在执行SQL:select pg_sleep(3),relname from pg_class;

执行计划为全表扫描,并且该真实的执行计划不需要通过explain analyze获取。

相关文章:

【PostgreSQL】AUTO_EXPLAIN - 慢速查询的日志执行计划

本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。 一、介绍 在本文中,我们将了解 PostgreSQL AUTO_EXPLAIN功能的工作原理,以及为什么应该使用它来收集在生产系统…...

讯飞星火超自然语言合成的完整Demo

依赖文件和功能 requirements.txt 该文件列出了所需的依赖包。 data.py 定义了应用的配置信息,如APPId,APIKey,APISecret等。包含请求数据和请求URL。 main.py 主程序,设置了WebSocket连接,定义了处理消息的各个回调函…...

封装一个上拉加载的组件(无限滚动)

一、封装 1.这个是在vue3环境下的封装 2.整体思路: 2.1传入一个elRef,其实就是一个使用页面的ref。 2.2也可以不传elRef,则默认滚动的是window。 import { onMounted, onUnmounted, ref } from vue; import { throttle } from underscore;ex…...

WHAT - 高性能和内存安全的 Rust(二)

目录 1. 所有权(Ownership)2. 借用(Borrowing)不可变借用可变借用 3. 可变性(Mutability)4. 作用域(Scope)综合示例 了解 Rust 的所有权(ownership)、借用&am…...

办理河南建筑工程乙级设计资质的流程与要点

办理河南建筑工程乙级设计资质的流程与要点 办理河南建筑工程乙级设计资质的流程与要点主要包括以下几个方面: 流程: 工商注册与资质规划:确保企业具有独立法人资格,完成工商注册,并明确乙级设计资质的具体要求&…...

分类算法和回归算法区别

分类算法和回归算法在机器学习中扮演着不同的角色,它们的主要区别体现在输出类型、应用场景以及算法目标上。以下是对两者区别和使用场景的详细分析: 一、区别 1.输出类型: 分类算法:输出是离散的类别标签,通常表示为…...

利用Frp实现内网穿透(docker实现)

文章目录 1、WSL子系统配置2、腾讯云服务器安装frps2.1、创建配置文件2.2 、创建frps容器 3、WSL2子系统Centos服务器安装frpc服务3.1、安装docker3.2、创建配置文件3.3 、创建frpc容器 4、WSL2子系统Centos服务器安装nginx服务 环境配置:一台公网服务器&#xff08…...

怎么用Excel生成标签打印模板,自动生成二维码

环境: EXCEL2021 16.0 问题描述: 怎么用excel生成标签打印模板自动生成二维码 解决方案: 在Excel中生成标签打印模板并自动生成二维码,可以通过以下几个步骤完成: 1. 准备数据 首先,确保你的Excel表…...

java基于ssm+jsp 美食推荐管理系统

1前台首页功能模块 美食推荐管理系统,在系统首页可以查看首页、热门美食、美食教程、美食店铺、美食社区、美食资讯、我的、跳转到后台等内容,如图1所示。 图1前台首页功能界面图 用户注册,在注册页面可以填写用户名、密码、姓名、联系电话等…...

数据分析:置换检验Permutation Test

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 介绍 置换检验是一种非参数统计方法,它不依赖于数据的分布形态,因此特别适…...

【React】使用Token做路由权限控制

在components/AuthRoute/index.js中 import { getToken } from /utils import { Navigate } from react-router-domconst AuthRoute ({ children }) > {const isToken getToken()if (isToken) {return <>{children}</>} else {return <Navigate to"/…...

机器学习周记(第四十四周:Robformer)2024.6.17~2024.6.23

目录 摘要ABSTRACT1 论文信息1.1 论文标题1.2 论文摘要1.3 论文引言1.4 论文贡献 2 论文模型2.1 问题描述2.2 Robformer2.2.1 Encoder2.2.2 Decoder 2.3 鲁棒序列分解模块2.4 季节性成分调整模块 摘要 本周阅读了一篇利用改进 Transformer 进行长时间序列预测的论文。论文模型…...

JAVA学习笔记DAY10——SpringBoot基础

文章目录 SpringBoot3 介绍SpringBoot 快速入门SpringBootApplication SpringBoot 配置文件统一配置管理Yaml 配置优势tips SpringBoot 整合 SpringMVC静态资源拦截器 interceptor SpringBoot 整合 DruidSpringBoot 整合 MybatisSpringBoot 整合 tx aopSpringBoot 打包 SpringB…...

如何在Android中实现多线程与线程池?

目录 一、Android介绍二、什么是多线程三、什么是线程池四、如何在Android中实现多线程与线程池 一、Android介绍 Android是一种基于Linux内核的开源操作系统&#xff0c;由Google公司领导开发。它最初于2007年发布&#xff0c;旨在为移动设备提供一种统一、可扩展的操作系统。…...

SCI绘图【1】-不同颜色表示密度和差异--密度图

参考资料&#xff1a;密度图&#xff08;Density Plot&#xff09; - 数据可视化图表 - 数字孪生百科 密度图是快速观察变量数值分布的有效方法之一。通常情况下&#xff0c;会根据两个变量将平面绘图区域分为非常多的子区域&#xff0c;之后以不同颜色表示落在该区域上样本的…...

C语言 while循环1

在C语言里有3种循环&#xff1a;while循环 do while 循环 for循环 while语句 //while语法结构 while&#xff08;表达式&#xff09;循环语句; 比如在屏幕上打印1-10 在while循环中 break用于永久的终止循环 在while循环中&#xff0c;continue的作用是跳过本次循环 …...

[C++][数据结构][LRU Cache]详细讲解

目录 1.什么是LRU Cache&#xff1f;2.LRU Cache实现 1.什么是LRU Cache&#xff1f; LRU是Least Recently Used的缩写&#xff0c;意思是最近最少使用&#xff0c;它是一种Cache替换算法。什么是 Cache&#xff1f; 狭义的Cache指的是位于CPU和主存间的快速RAM 通常它不像系统…...

怎样激励员工积极应用新版FMEA培训后的知识?

在快节奏的职场环境中&#xff0c;新版FMEA&#xff08;失效模式与影响分析&#xff09;的培训无疑是提升员工技能、优化工作流程的重要一环。然而&#xff0c;如何让员工积极地将所学知识应用于实际工作中&#xff0c;却是一个值得深入探讨的问题。下面&#xff0c;深圳天行健…...

WDF驱动开发-WDF总线枚举(一)

支持在总线驱动程序中进行 PnP 和电源管理 某些设备永久插入系统&#xff0c;而其他设备可以在系统运行时插入和拔出电源。 总线驱动 必须识别并报告连接到其总线的设备&#xff0c;并且他们必须发现并报告系统中设备的到达和离开情况。 总线驱动程序标识和报告的设备称为总线…...

React useEffect 执行时机

默认情况下&#xff0c;Effect 在每次渲染&#xff08;包括初始渲染&#xff09;后运行。 如果 React 的所有依赖项都与上次渲染时的值相同&#xff0c;则将跳过本次 Effect。 useEffect(() > {// 这里的代码会在每次渲染后执行 });useEffect(() > {// 这里的代码只会在…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...