PostgreSQL如何根据执行计划进行性能调优?

这篇具有很好参考价值的文章主要介绍了PostgreSQL如何根据执行计划进行性能调优?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

EXPLAIN命令

PG中EXPLAIN命令语法格式如下:

EXPLAIN [(option[,...])] statement
EXPLAIN [ANALYZE] [VERBOSE] statement

该命令的options如下:

  • ANALYZE [boolean]
  • VERBOSE [boolean]
  • COSTS [boolean]
  • BUFFERS [boolean]
  • FORMAT {TEXT | XML | JSON | YAML}
  1. ANALYZE 选项通过实际执行SQL来获得SQL命令的实际执行计划。ANALYZE选项查看到的执行计划因为真正被执行过,所以可以看到执行计划每一步耗费了多长时间,以及它实际返回的行数

    • 如果SQL语句是一个插入、删除、更新或者CREATE TABLE AS语句(这些语句会修改数据库),为了不影响实际数据,可以把EXPLAIN ANALYZE放到一个事务中,执行完后回滚事务:

      BEGIN;
      EXPLAIN ANALYZE…;
      ROLLBACK;

  2. VERBOSE选项显示计划的附加信息,如计划树中每个节点输出的各个列,如果触发器被触发,还会输出触发器的名称。该选项的默认值为FALSE。

  3. COST选项显示每个计划节点的启动成本和总成本,以及估计行数和每行宽度。该选项的默认值为TRUE。

  4. BUFFERS选项显示缓冲区使用的信息,只能与ANALYZE参数一起使用,默认值为FALSE。

  5. FORMAT选项指定输出格式,可以是TEXT、XML、JSON或者YAML。默认值为TEXT。

EXPLAIN输出结果解释

如下是一个简单的EXPLAIN输出结果解释:
PostgreSQL如何根据执行计划进行性能调优?,PostgreSQL,postgresql,数据库,服务器

  • Seq Scan on jxx_test 表示顺序扫描表jxx_test,顺序扫描也就是全表扫描
  • cost=0.00…22.70 cost=后面有两个数字,中间由“…”分隔,第一个数字0.00表示启动的成本,也就是说返回第一行需要多少cost值;第二个数字表示返回所有数据的成本;
  • rows=1270:表示会返回1270行,但是表中只有一条数据,真实执行计划需要analyze参数
  • width=36:表示每行平均宽度为36字节

成本cost用于描述SQL命令的执行代价,默认情况下,不同操作的cost值如下:

  • 顺序扫描一个数据块,cost值为1
  • 随机扫描一个数据块,cost值为4
  • 处理一个数据行的CPU代价,cost值为0.01
  • 处理一个索引行的CPU代价,cost值为0.005
  • 每个操作符的CPU代价为0.0025

根据上面的操作类型,PG可以智能计算出一个SQL命令的执行代价,虽然计算结果不是很精确,但大多数情况下够用了。

EXPLAIN 使用示例

默认情况下输出的执行计划是文本格式,也可以输出JSON格式,如下:

文本格式

PostgreSQL如何根据执行计划进行性能调优?,PostgreSQL,postgresql,数据库,服务器

其他格式均支持,例如:XML、YAML等格式

精确执行analyze

添加analyze参数获得更精确的执行计划:
PostgreSQL如何根据执行计划进行性能调优?,PostgreSQL,postgresql,数据库,服务器

只查看执行路径

如果值查看执行的路径而不看cost值,可以添加costs false选项:
PostgreSQL如何根据执行计划进行性能调优?,PostgreSQL,postgresql,数据库,服务器

实际代价与缓冲区命中

联合使用analyze选项和buffers选项,通过实际执行来查看实际的代价和缓冲区命中的情况:
PostgreSQL如何根据执行计划进行性能调优?,PostgreSQL,postgresql,数据库,服务器

Buffers: shared hit=16257 read=918323

  • shared hit=16257 表示在共享内存中直接读到16257个块
  • read=918323 从磁盘中读到918323个块
  • select语句有可能也会出现写,如written=? 因为共享内存中有脏块,从磁盘中读出的块必须把内存中的脏块挤出内存,所以会产生写

全表扫描

全表扫描在PG中也称为顺序扫描(Seq Scan),全表扫描就是把表中的所有数据块从头到尾读一遍,然后从中找到符合条件的数据块。

PostgreSQL如何根据执行计划进行性能调优?,PostgreSQL,postgresql,数据库,服务器

索引扫描

索引通常是为了加快查询数据的速度而增加的。索引扫描,就是在索引中找出需要的数据行的物理位置,然后再到表的数据块中把相应的数据读出来的过程。

索引扫描在explain命令的输出结果中用Index Scan表示:
PostgreSQL如何根据执行计划进行性能调优?,PostgreSQL,postgresql,数据库,服务器

位图扫描

位图扫描也是走索引的一种方式。方法是扫描索引,把满足条件的行或块在内存中建一个位图,扫描完索引后,再根据位图到表的数据文件中把相应的数据读出来。如果走了两个索引,可以把两个索引形成的位图通过AND或OR计算合并成一个,再到表的数据文件中把数据读出来。

当执行计划的结果行数很多时会走这种扫描,如非等值查询、IN子句或有多个条件都可以走不同的索引时

PostgreSQL如何根据执行计划进行性能调优?,PostgreSQL,postgresql,数据库,服务器

  • Bitmap Index Scan先在索引中找到符合条件的行
  • 创建位图
  • 根据位图到表中扫描,也就是Bitmap Heap Scan

下面是走两个索引后将位图继续进行BitmapOr运算的示例:
PostgreSQL如何根据执行计划进行性能调优?,PostgreSQL,postgresql,数据库,服务器

从上图执行计划可以看到BitmapOr操作,即使用OR运算合并两个位图文章来源地址https://www.toymoban.com/news/detail-526601.html

到了这里,关于PostgreSQL如何根据执行计划进行性能调优?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • postgresql 性能调优

    性能调优是为了提高 PostgreSQL 数据库的性能和响应速度。下面是一些常见的 PostgreSQL 性能调优技巧: 定期进行数据库维护:对数据库进行定期的备份、清理和优化操作,包括 VACUUM、ANALYZE、REINDEX 等,以保持数据库的健康状态, 定期进行数据库维护是保持 PostgreSQL 数据库健康状

    2024年02月11日
    浏览(49)
  • 深入解读Kafka:如何进行运维与监控,实现性能调优和故障排除

    Kafka是由Apache Software Foundation开发的一款分布式流处理平台和消息队列系统 可以处理大规模的实时数据流,具有高吞吐量、低延迟、持久性和可扩展性等优点 常用于数据架构、数据管道、日志聚合、事件驱动等场景,对Kafka的运维和监控十分必要 本文旨在介绍Kafka的运维和监

    2024年02月04日
    浏览(50)
  • PostgreSQL性能调优:优化查询和索引设计

    随着数据量的增长和业务需求的变化,数据库性能成为了许多企业关注的焦点之一。在众多的数据库管理系统中,PostgreSQL因其稳定性和可靠性而备受青睐。然而,即使是最强大的系统也需要合适的调优,以确保其能够高效地处理大规模数据和复杂查询。 本文将介绍如何在P

    2024年02月07日
    浏览(57)
  • PG DBA培训23:PostgreSQL执行计划与统计信息

    本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQL Execution plan and statistical,学完本课程可以掌握PostgreSQL性能优化之查询处理,PostgreSQL处理SQL的整个逻辑顺序,PostgreSQL查询处理的流程讲解,PostgreSQL性能优化之执行计划,执行计划的介绍,执行计划查看语法,执行

    2024年01月22日
    浏览(52)
  • 如何在PostgreSQL中使用pg_stat_statements插件进行SQL性能统计和分析?

    PostgreSQL中的 pg_stat_statements 是一个强大的插件,用于追踪执行时间最长的SQL语句。通过它,我们可以获取有关SQL语句执行频率、总执行时间、平均执行时间等信息,从而进行性能调优和问题分析。 首先,我们需要确保 pg_stat_statements 插件已经安装。在大多数PostgreSQL发行版中,

    2024年04月25日
    浏览(79)
  • 执行计划缓存,Prepared Statement性能跃升的秘密

    摘要: 一起看一下GaussDB(for MySQL)是如何对执行计划进行缓存并加速Prepared Statement性能的。 本文分享自华为云社区《执行计划缓存,Prepared Statement性能跃升的秘密》,作者: GaussDB 数据库。 在数据库系统中,SQL(Structured Query Language)语句输入到系统后,一般要经历:词法语法

    2024年02月07日
    浏览(34)
  • 【SQL开发实战技巧】系列(二十三):数仓报表场景☞ 如何对数据排列组合去重以及通过如何找到包含最大值和最小值的记录这个问题再次用执行计划给你证明分析函数性能不一定高

    【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串UNION与OR的使用注意事项 【SQL开发实战技巧】系列

    2023年04月10日
    浏览(72)
  • 【性能优化】一、使用JMeter进行压力测试并进行简单调优

    压力测试不同于功能测试,其目的是为了测试出系统在高并发,高数据量的情况下可能会出现的问题(内存泄露、并发、同步) 一种典型的内存泄漏就是对象在创建之后由很多用户进行调用,导致对象被不断新建但复用率很低,导致内存不足(内存泄露的典型问题) 有效的

    2024年02月03日
    浏览(45)
  • Hive执行计划之只有map阶段SQL性能分析和解读

    目录 目录 概述 1.不带函数操作的select-from-where型简单SQL 1.1执行示例 1.2 运行逻辑分析 1.3 伪代码解释 2.带普通函数和运行操作符的普通型SQL执行计划解读 2.1 执行计划解读 2.2 伪代码解释逻辑 可能所有的SQLboy刚接触SQL语句的时候都是select xxx from xxx where xxx。在hive中,我们把这

    2024年02月08日
    浏览(51)
  • 性能分析与调优: Linux 使用 iperf3 进行TCP网络吞吐量测试

    目录 一、实验 1.环境 2.TCP网络吞吐量的微观基准测试 二、问题 1.iperf参数有哪些 2.iperf如何二进制安装 (1)主机 表1-1 主机 主机 架构 组件 IP 备注 prometheus 监测 系统 prometheus、node_exporter  192.168.204.18 grafana 监测GUI grafana 192.168.204.19 agent  监测 主机 node_exporter 192.168.204.20 (1)

    2024年02月03日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包