postgres query plan

2024-04-18 12:58
文章标签 plan query postgres

本文主要是介绍postgres query plan,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PostgreSQL数据库针对它收到的每一个sql查询都会设计一个query plan-查询计划。要想拥有良好的查询性能performance, 选择正确的query计划来匹配查询的结构和数据本身的特性绝对是至关重要的,因此postgres数据库系统有一个复杂的计划器planner用来为sql查询选择好的query plan。 我们可以使用 EXPLAIN 命令查看规划器为任何查询创建的查询计划。

query plan查询计划的结构是计划节点树plan node。 树底层的节点是数据库表扫描节点:它们从数据库表中返回数据的原始行。 不同的表访问方法有不同类型的扫描节点:顺序扫描sequential scan、index scan索引扫描和位图索引扫描bitmap scan。 如果查询需要对原始行进行join、aggregation聚合、排序或其他操作,那么在扫描节点之上会有额外的节点来执行这些操作。 同样,通常有不止一种可能的方法来执行这些操作,因此这里也可能出现不同的节点类型。 EXPLAIN 的输出当中对计划树中的每个节点都有一行,显示基本节点类型以及计划器为执行该计划节点所做的成本估计。 第一行(最上面的节点)是计划的估计总执行成本; sql规划寻求最小化的正是这个数字。

下面是一个例子:

EXPLAIN 生成的query plan中有几个数字,他们的意思是(从左到右):

  •  估计启动成本(输出扫描开始前花费的时间,例如在排序节点中进行排序的时间)
  • 估计总成本(如果所有行都被检索时的花费,当然也有可能不会检索所有行带有 LIMIT 子句的查询将停止支付限制计划节点的输入节点的总成本)
  • 此执行计划节点输出的估计行数(仅当执行完成时)
  • 此执行计划节点输出的行的估计平均宽度(以字节为单位)

执行成本以由计划者的成本参数确定的任意单位进行衡量。 传统的做法是以磁盘页面获取为单位来衡量成本; 也就是说,seq_page_cost 通常设置为 1.0,而其他成本参数则相对于此设置。 

需要注意的是,上层节点的成本包括其所有子节点的成本。 同样重要的是要意识到成本只反映了计划者关心的事情。 特别是,成本不考虑将结果行传输到客户端所花费的时间,这可能是实际经过时间的一个重要因素; 但是计划者忽略了它,因为它不能通过改变计划来改变它。 (我们相信,每个正确的计划都会输出相同的行集。)

行值有点棘手,因为它不是计划节点处理或扫描的行数。 它通常较小,反映了在节点上应用的任何 WHERE 子句条件的估计选择性。 理想情况下,顶级行估计将近似于查询实际返回、更新或删除的行数。

回到我们的例子:

EXPLAIN SELECT * FROM tenk1;QUERY PLAN
-------------------------------------------------------------Seq Scan on tenk1  (cost=0.00..458.00 rows=10000 width=244)

这很简单。 如果你这样做:

SELECT relpages, reltuples FROM pg_class WHERE relname = 'tenk1';

你会发现tenk1有358个磁盘页和10000行。 估计成本计算为(读取的磁盘页数 * seq_page_cost)+(扫描的行数 * cpu_tuple_cost&#x

这篇关于postgres query plan的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/914848

相关文章

postgres数据库中如何看查询是否走索引,以及在什么情况下走索引

在 PostgreSQL 中,可以通过 EXPLAIN 或 EXPLAIN ANALYZE 查看查询计划,以判断查询是否使用了索引。除此之外,了解索引的使用条件对于优化查询性能也很重要。 1. 如何查看查询是否使用索引 使用 EXPLAIN 查看查询计划 EXPLAIN 显示 PostgreSQL 如何执行查询,包括是否使用索引。 EXPLAIN SELECT * FROM users WH

Study Plan For Algorithms - Part24

1. 包含min函数的栈 定义栈的数据结构,要求在该类型中实现一个 min 函数,能够获取栈的最小元素。在该栈中,调用 min、push 以及 pop 函数的时间复杂度均为 O (1)。 方法: class MinStack:def __init__(self):self.stack = []self.min_stack = [float('inf')]def push(self, x):sel

【0324】Postgres内核 Shared Buffer Access Rules (共享缓冲区访问规则)说明

0. 章节内容 1. 共享磁盘缓冲区访问机制 (shared disk buffers) 共享磁盘缓冲区有两套独立的访问控制机制:引用计数(a/k/a pin 计数)和缓冲区内容锁。(实际上,还有第三级访问控制:在访问任何属于某个关系表的页面之前,必须持有该关系表的适当类型的锁。这里不讨论关系级锁。) Pins 在对缓冲区做任何操作之前,必须“对缓冲区pin”(即增加其引用计数, re

构建现代API:FastAPI中Query与Body参数的最佳搭配

在FastAPI中,Query 和 Body 是两种不同的依赖注入器,它们的应用场景取决于你的具体需求。以下是它们各自常见的使用场景: Query 参数 使用场景: 当你需要从URL中获取一些简单的参数时,例如过滤、排序、分页等。 当数据量不大,且可以作为URL的一部分安全传输时。当数据不需要复杂的结构时。 Body 参数 使用场景: 当你需要发送较为复杂的数据结构时,例如包含多个字段

【0323】Postgres内核之 hash table sequentially search(seq_scan_tables、num_seq_scans)

0. seq scan tracking 我们在这里跟踪活跃的 hash_seq_search() 扫描。 需要这种机制是因为如果扫描正在进行时发生桶分裂(bucket split),它可能会访问两次相同的条目,甚至完全错过某些条目(如果它正在访问同一个分裂的桶中的条目)。因此,如果正在向表中插入数据,我们希望抑制桶分裂。 在当前的使用中,这种情况非常罕见,因此只需将分裂推迟到下一次插入即可。

执行计划查看方法(Explain plan)

什么是执行计划 所谓执行计划,顾名思义,就是对一个查询任务,做出一份怎样去完成任务的详细方案。举个生活中的例子,我从珠海要去英国,我可以 选择先去香港然后转机,也可以先去北京转机,或者去广州也可以。但是到底怎样去英国划算,也就是我的费用最少,这是一件值得考究 的事情。同样对于查询而言,我们提交的SQL仅仅是描述出了我们的目的地是英国,但至于怎么去,通常我们的SQL中是没有给出提示信息

【硬刚ES】ES基础(二十) 单字符串多字段查询:Dis Max Query

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的ES部分补充。

【硬刚ES】ES基础(十九) Query Filtering 与多字符串多字段查询

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的ES部分补充。

[LeetCode] 303. Range Sum Query - Immutable

题:https://leetcode.com/problems/range-sum-query-immutable/description/ 题目 Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. Example: Given nums

Oracle - ORA-01789: Query block has incorrect number of result columns

一、原因     这个错误一般是在执行表之间的相加(union),相减(minus)等SQL语句时,两个个查询块具有不一致的结果列数所导致的。 二、方案     只要将两段SQL语句的列数调整为一致就可以解决。使用union时,要注意数据库字段的格式要一致,如varchar和nvarchar是不一样的。