Postgresql中常见的执行计划解释

PostgreSQL中的执行计划(或查询计划)是数据库管理系统用来详细说明如何执行特定SQL查询的一系列操作步骤。简单来说,执行计划就是数据库如何解读你的SQL语句,并决定最有效率的方式去检索或更新所需数据的蓝图。
执行计划对于性能优化至关重要,因为它可以帮助数据库管理员和开发者理解:

查询的执行路径:执行计划展示了数据库如何组织数据检索或更新的具体步骤。这包括了数据是如何从磁盘读取到内存中的,以及如何在内部处理以满足查询请求。

数据访问方法:执行计划解释了数据库是如何访问表和索引的。例如,它可能使用顺序扫描(sequential scan)、索引扫描(index scan)、位图扫描(bitmap heap scan)等不同的访问方法来检索数据。

连接方式:对于涉及多个表的查询,执行计划显示了表之间是如何连接的,比如使用嵌套循环连接(Nested Loop Join)、合并连接(Merge Join)或散列连接(Hash Join)等方法。

资源消耗估计:执行计划提供了关于查询执行需要消耗的资源(如CPU时间、I/O成本和内存使用)的估计。这有助于识别可能的性能瓶颈。

优化查询:通过分析执行计划,开发者和数据库管理员可以识别并修改低效的SQL查询,例如通过添加或调整索引、修改查询结构或更改数据库配置来提高性能。
要获取PostgreSQL中的执行计划,可以使用EXPLAIN命令,后跟你想要分析的SQL查询。例如:

EXPLAIN SELECT * FROM my_table WHERE column = 'value';

此命令将返回该查询的执行计別,但不会实际执行该查询。如果你还想看到执行该查询时的实际运行时间和资源消耗,可以使用EXPLAIN ANALYZE,这将执行查询并提供更详细的执行统计信息。
理解并有效地使用执行计划是进行数据库查询优化的关键,可以显著提高应用程序的性能和响应速度。

下面给出一下常用的执行计划分别解释一下每一步的含义:

EXPLAININSERT INTO mid_all_module_data_relation_t(documentCode,relation_id,mut_id,mr_no,order_code,rcv_sample_code,ssp_sample_code,sde_sample_code,su_sample_code,slc_sample_code,sp_sample_code,slq_sample_code,seq_sample_code,qc_sample_code,mut_sample_code,sep_level,remarks,is_valid,srlt_id,creation_date,created_by,mod_date,mod_by)SELECT concat(t1.relation_id, '-n') AS documentCode,t1.relation_id,NULL                         AS mut_id,t1.mr_no,t1.order_code,t1.rcv_sample_code,t1.ssp_sample_code,t1.sde_sample_code,t1.su_sample_code,t1.slc_sample_code,t1.sp_sample_code,t1.slq_sample_code,t1.seq_sample_code,t1.qc_sample_code,t1.mut_sample_code,t1.sep_level,t1.remarks,t1.is_valid,t1.srlt_id,t1.creation_date,t1.created_by,t1.mod_date,t1.mod_byFROM mid_module_data_relation_t t1WHERE t1.seq_sample_code IS NULLAND t1.mod_date >= '2024-03-01'::timestampAND t1.mod_date < '2024-03-15'::timestampON CONFLICT(documentCode) DO UPDATE SET relation_id=EXCLUDED.relation_id,mr_no=EXCLUDED.mr_no,order_code=EXCLUDED.order_code,rcv_sample_code=EXCLUDED.rcv_sample_code,ssp_sample_code=EXCLUDED.ssp_sample_code,sde_sample_code=EXCLUDED.sde_sample_code,su_sample_code=EXCLUDED.su_sample_code,slc_sample_code=EXCLUDED.slc_sample_code,sp_sample_code=EXCLUDED.sp_sample_code,slq_sample_code=EXCLUDED.slq_sample_code,seq_sample_code=EXCLUDED.seq_sample_code,qc_sample_code=EXCLUDED.qc_sample_code,mut_sample_code=EXCLUDED.mut_sample_code,sep_level=EXCLUDED.sep_level,remarks=EXCLUDED.remarks,is_valid=EXCLUDED.is_valid,srlt_id=EXCLUDED.srlt_id,creation_date=EXCLUDED.creation_date,created_by=EXCLUDED.created_by,mod_date=EXCLUDED.mod_date,mod_by=EXCLUDED.mod_by;

以上代码的执行计划如下:

Insert on mid_module_data_relation_t  (cost=2407.66..470127.47 rows=0 width=0)->  Nested Loop Anti Join  (cost=2407.66..470127.47 rows=24766 width=1128)->  Bitmap Heap Scan on pdw_sep_data_relation_t t  (cost=2407.10..374737.61 rows=36046 width=232)Recheck Cond: ((edit_time >= '2024-03-01 00:00:00'::timestamp without time zone) AND (edit_time < '2024-03-15 00:00:00'::timestamp without time zone))Filter: ((mr_no IS NOT NULL) AND (isleaf = 1))->  Bitmap Index Scan on idx_pdw_sep_data_relation_t_edit_time  (cost=0.00..2398.09 rows=121366 width=0)Index Cond: ((edit_time >= '2024-03-01 00:00:00'::timestamp without time zone) AND (edit_time < '2024-03-15 00:00:00'::timestamp without time zone))->  Index Only Scan using idx_mid_module_data_relation_t_srlt_id on mid_module_data_relation_t td  (cost=0.56..2.62 rows=1 width=32)Index Cond: (srlt_id = (t.srlt_id)::text)这个执行计划用于描述一个插入操作(Insert)在mid_module_data_relation_t表中的执行过程。这个查询涉及一个嵌套循环反连接(Nested Loop Anti Join),它是在两个表之间进行的,即pdw_sep_data_relation_t表和mid_module_data_relation_t表。下面是对每个步骤的解释:Insert on mid_module_data_relation_t (cost=2407.66..470127.47 rows=0 width=0): 
这表示我们正在对mid_module_data_relation_t表执行一个插入操作。成本(cost)估计从2407.66到470127.47,预计影响的行数为0(在执行计划的这个层面,并不直接插入行,因此行数为0),每行宽度为0(因为是插入操作,所以这里的宽度不适用)。Nested Loop Anti Join (cost=2407.66..470127.47 rows=24766 width=1128): 
这个操作是一个嵌套循环反连接,预计成本从2407.66到470127.47,预计返回24766行,每行宽度为1128字节。反连接是一种特殊的连接,它返回左表中没有匹配右表的所有行。简单来说,它查找左表中不存在于右表的记录。Bitmap Heap Scan on pdw_sep_data_relation_t t (cost=2407.10..374737.61 rows=36046 width=232):
这表示对pdw_sep_data_relation_t表进行了位图堆扫描。扫描条件是edit_time字段的值在2024-03-01 00:00:00和2024-03-15 00:00:00之间。还有一个过滤条件,即mr_no字段不能为NULL,且isleaf字段的值必须为1。预计成本从2407.10到374737.61,预计找到36046行,每行宽度为232字节。Bitmap Index Scan on idx_pdw_sep_data_relation_t_edit_time: 
这是位图堆扫描的一部分,使用idx_pdw_sep_data_relation_t_edit_time索引来找到符合时间条件的记录。这个索引扫描的条件与上述相同。Index Only Scan using idx_mid_module_data_relation_t_srlt_id on mid_module_data_relation_t td (cost=0.56..2.62 rows=1 width=32): 
这表示对mid_module_data_relation_t表进行了仅索引扫描,使用了idx_mid_module_data_relation_t_srlt_id索引。扫描条件是mid_module_data_relation_t表的srlt_id字段的值必须等于pdw_sep_data_relation_t表的srlt_id字段的值。预计成本从0.56到2.62,预计每次匹配到1行,每行宽度为32字节。
总的来说,这个执行计划说明了一个插入操作是如何通过在pdw_sep_data_relation_t表中找到符合条件的记录,然后通过反连接确保这些记录在mid_module_data_relation_t表中不存在,最后将这些不存在的记录插入到mid_module_data_relation_t表中。这种方式确保了插入的是pdw_sep_data_relation_t表中新的或更新的记录,而不是已经存在于mid_module_data_relation_t表中的记录。

来看另一个执行计划:

Insert on mid_all_module_data_relation_t  (cost=13716.38..578123.61 rows=0 width=0)Conflict Resolution: UPDATEConflict Arbiter Indexes: pk_mid_all_module_data_relation_t->  Nested Loop Anti Join  (cost=13716.38..578123.61 rows=724094 width=500)->  Bitmap Heap Scan on mid_module_data_relation_t t1  (cost=13715.82..102420.00 rows=803018 width=280)Recheck Cond: (seq_sample_code IS NOT NULL)->  Bitmap Index Scan on idx_mid_module_data_relation_t_seq_sample_code  (cost=0.00..13515.07 rows=803018 width=0)Index Cond: (seq_sample_code IS NOT NULL)->  Index Only Scan using idx_mgmt_new_sample_code on mid_gene_mutation_t t2  (cost=0.56..3.23 rows=125 width=16)Index Cond: (sample_code = (t1.seq_sample_code)::text)这个执行计划描述了对mid_all_module_data_relation_t表进行的一个插入操作,其中涉及冲突解决策略和两个表mid_module_data_relation_t和mid_gene_mutation_t的关联查询。下面是详细解释:基本操作
Insert on mid_all_module_data_relation_t (cost=13716.38..578123.61 rows=0 width=0): 
这说明是一个对mid_all_module_data_relation_t表的插入操作。成本估计(cost)从13716.38到578123.61,预计影响的行数为0(在生成执行计划时,不会计算实际插入的行数),每行宽度为0(因为是插入操作,所以没有宽度概念)。冲突解决
Conflict Resolution: UPDATE: 
如果插入操作遇到唯一键(通常是主键)冲突,将会执行更新操作替代插入。
Conflict Arbiter Indexes: pk_mid_all_module_data_relation_t: 
冲突解决策略使用的是pk_mid_all_module_data_relation_t索引,这意味着如果有记录的主键已经存在于mid_all_module_data_relation_t表中,则会触发更新操作而非插入新记录。查询细节
Nested Loop Anti Join (cost=13716.38..578123.61 rows=724094 width=500): 
这是一个嵌套循环反连接操作,用于在两个表之间进行关联查询,并确保左表(mid_module_data_relation_t)中的记录在右表(mid_gene_mutation_t)中不存在。预计会处理724094行数据,每行宽度为500字节。左表扫描
Bitmap Heap Scan on mid_module_data_relation_t t1 (cost=13715.82..102420.00 rows=803018 width=280): 
这个步骤展示了对mid_module_data_relation_t表的位图堆扫描,条件是seq_sample_code字段非空。这表明查询正在搜索有seq_sample_code值的所有记录。预计找到803018行,每行宽度为280字节。
Bitmap Index Scan on idx_mid_module_data_relation_t_seq_sample_code: 这是位图堆扫描的一部分,使用idx_mid_module_data_relation_t_seq_sample_code索引来快速定位满足条件的记录。右表扫描
Index Only Scan using idx_mgmt_new_sample_code on mid_gene_mutation_t t2 (cost=0.56..3.23 rows=125 width=16): 
这个步骤描述了对mid_gene_mutation_t表的仅索引扫描,使用idx_mgmt_new_sample_code索引。条件是sample_code字段的值必须与左表mid_module_data_relation_t中的seq_sample_code字段相匹配。预计每次匹配到125行,每行宽度为16字节。总结
整个执行计划描述了一个通过关联mid_module_data_relation_t和mid_gene_mutation_t两表,尝试向mid_all_module_data_relation_t表插入数据的过程。如果插入的数据在mid_all_module_data_relation_t表中已经存在(基于pk_mid_all_module_data_relation_t索引判断),则执行更新操作。查询主要通过seq_sample_code字段在两个表之间建立关联,并利用索引来优化数据检索和冲突检测。

平时写完代码后可以简单的查看一下执行计划,看看哪里可能会存在性能瓶颈;遇到复杂的语句跑不动,通过执行计划分析下会有好的优化方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/766586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SysBench】OLTP 基准测试示例

前言 本文采用 MySQL 沙盒实例作为测试目标&#xff0c;使用 sysbench-1.20 对其做 OLTP 基准测试。 有关 MySQL 沙盒的更多信息&#xff0c;请参阅 玩转 MySQL Shell 沙盒实例&#xff0c;【MySQL Shell】6.8 AdminAPI MySQL 沙盒 。 1、部署一个 MySQL 沙盒实例 使用 mysq…

指尖论文怎么用 #经验分享#学习方法

指尖论文是一款优秀的论文写作、查重降重工具&#xff0c;被广泛认可为高效、可靠、方便的辅助工具。那么&#xff0c;如何正确地使用指尖论文呢&#xff1f; 首先&#xff0c;用户需要注册一个指尖论文的账号&#xff0c;并登录到平台上。注册过程非常简单&#xff0c;只需要输…

瑞芯微RK3576|触觉智能:开启科技新篇章

更多产品详情可关注深圳触觉智能官网&#xff01; “瑞芯微&#xff0c;创新不止步&#xff01;”——全新芯片RK3576即将震撼登场。指引科技风潮&#xff0c;创造未来无限可能&#xff01;这款芯片在瑞芯微不断创新和突破的道路上&#xff0c;不仅是对过往成就的完美延续&…

V R元宇宙平台的未来方向|V R主题馆加 盟|游戏体验馆

未来&#xff0c;VR元宇宙平台可能会呈现出以下发展趋势和可能性&#xff1a; 全面融合现实与虚拟世界&#xff1a; VR元宇宙平台将更加无缝地融合现实世界和虚拟世界&#xff0c;用户可以在虚拟环境中进行各种活动&#xff0c;与现实世界进行互动&#xff0c;并且体验到更加逼…

Golang基础 Label标签与goto跳转

使用方法 Label 和goto是必须的 Label可以声明再函数体的任何地方 Label的作用范围是在函数体中 Label在嵌套函数(闭包)是不可用的. 不管是在闭包里调用闭包外的Label, 还是在闭包外调用闭包里的Label 变量的声明必须在goto之前 示例 package mainimport "fmt"…

数据仓库建模方法万字详解

在数据仓库的建设过程中&#xff0c;数据建模是至关重要的一环。它决定了数据仓库的结构和性能&#xff0c;直接影响到数据分析和决策的效率和准确性。在进行数据建模之前&#xff0c;必须对企业进行全面的业务梳理。通过建立业务模型&#xff0c;我们可以全面了解企业的业务架…

FileZilla 链接服务器提示 20 秒连接超时

FileZilla 有个默认设置是如果 20 秒没有数据的话会自动中断链接。 Command: Pass: **************** Error: Connection timed out after 20 seconds of inactivity Error: Could not connect to server修改配置 这个配置是可以修改的&#xff0c;修改的步骤为&#xff1a; …

数据可视化-ECharts Html项目实战(5)

在之前的文章中&#xff0c;我们学习了如何设置滚动图例&#xff0c;工具箱设置和插入图片。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢 数据可视化-ECharts…

Vue3 + Django 前后端分离项目实现密码认证登录

1、功能需求 通常中小型前后端项目&#xff0c;对安全要求不高&#xff0c;也可以采用密码认证方案。如果只用django来实现非常简单。采用 Vue3 前后端分离架构&#xff0c;实现起来稍繁琐一点&#xff0c;好处是可以利用各种前端技术栈&#xff0c;如element-plus UI库来渲染…

[C#] .NET8增加了Arm架构的多寄存器的查表函数(VectorTableLookup/VectorTableLookupExtension)

发现.NET8增加了Arm架构的多寄存器的查表函数&#xff08;VectorTableLookup/VectorTableLookupExtension&#xff09;&#xff0c;这给编写SIMD向量化算法带来了方便。 一、指令说明 在学习Arm的AdvSimd&#xff08;Neon&#xff09;指令集时&#xff0c;发现它的Lookup&…

Git Commit 提交规范,变更日志、版本发布自动化和 Emoji 提交标准

前言 Git Commit 是开发的日常操作, 一个优秀的 Commit Message 不仅有助于他人 Review, 还可以有效的输出 CHANGELOG, 对项目的管理实际至关重要, 但是实际工作中却常常被大家忽略&#xff0c;希望通过本文&#xff0c;能够帮助大家规范 Git Commit&#xff0c;并且展示相关 …

Spring Cloud微服务功能及其组件详细讲解

Spring Cloud微服务功能及其组件详细讲解 文章目录 Spring Cloud微服务功能及其组件详细讲解前言&#xff1a;什么是微服务&#xff1f;一、Spring Cloud原理简述二、核心组件1、服务发现——Nacos/Eureka/Consul1&#xff09;Nacos服务发现2&#xff09;Eureka服务发现3&#…

优化 - 排序算法

一、概念 冒泡排序从左往右比较相邻的两个元素&#xff0c;右比左小就换位&#xff0c;这样最大值就出现在了右边最后一个元素上&#xff0c;再从左边第一个元素开始往右比较到倒数第二个元素&#xff0c;如此重复...选择排序 通过线性查找&#xff08;从左往右挨个查找&#…

Mongodb入门到入土,安装到实战,外包半年学习的成果

这是我参与「第四届青训营 」笔记创作活动的的第27天&#xff0c;今天主要记录前端进阶必须掌握内容Mongodb数据库,从搭建环境到运行数据库,然后使用MongodB; 一、文章内容 数据库基础知识关系型数据库和非关系型数据库为什么学习Mongodb数据库环境搭建及运行MongodbMongodb命…

【进程概念】启动进程 | 查看进程 | 创建进程

目录 启动进程 查看进程 方法1&#xff1a;/proc 方法2&#xff1a;查看脚本 ​方法3&#xff1a;系统调用获取进程标示符❗❗ 终止进程 创建进程&#xff08;主fork) &#x1f642;查看父子进程的pid &#x1f642;进程创建/执行/终止 &#x1f642;多次重新启动进…

Pycharm运行yolov5报错Error: Failed to initialize: Bad git executable.错误的解决方案

一、报错代码 ImportError: Failed to initialize: Bad git executable. The git executable must be specified in one of the following ways:- be included in your $PATH- be set via $GIT_PYTHON_GIT_EXECUTABLE- explicitly set via git.refresh()All git commands will…

STM32 CAN的工作模式

STM32 CAN的工作模式 正常模式 正常模式下就是一个正常的CAN节点&#xff0c;可以向总线发送数据和接收数据。 静默模式 静默模式下&#xff0c;它自己的输出端的逻辑0数据会直接传输到它自己的输入端&#xff0c;逻辑1可以被发送到总线&#xff0c;所以它不能向总线发送显性…

鸿蒙开发实战:网络请求库【axios】

简介 [Axios] &#xff0c;是一个基于 promise 的网络请求库&#xff0c;可以运行 node.js 和浏览器中。本库基于[Axios]原库v1.3.4版本进行适配&#xff0c;使其可以运行在 OpenHarmony&#xff0c;并沿用其现有用法和特性。 http 请求Promise APIrequest 和 response 拦截器…

英语 单词记忆学习

关于足部的单词&#xff0c;可以从不同的角度来分类&#xff0c;比如解剖学、鞋类、运动等。以下是一些与足部相关的单词&#xff1a; ### 解剖学术语 1. **Ankle** (踝关节) - 脚与腿相接的部分。 2. **Arch** (足弓) - 脚底的弓形结构。 3. **Toe** (脚趾) - 脚的前端部分。…

Stable Diffusion实现光影字效果

昨天下午有人在群里发光影图片&#xff0c;大家都觉得很酷&#xff0c;我没怎么在意。直到早上我在小红书看到有人发同款图片&#xff0c;只是一晚上的时间点赞就超过了8000&#xff0c;而且评论数也很高&#xff0c;也可以做文字定制变现。研究了一下发现这个效果不难实现&…