PostgreSQL:更新字段慢

news2025/2/25 18:50:59

目录标题

  • PostgreSQL 慢查询优化与 `pg_stat_statements` 使用
    • 1. 启用慢查询日志
    • 2. 使用 `pg_stat_statements` 扩展收集查询统计信息
    • 3. 查找执行时间较长的查询
    • 4. 分析慢查询的执行计划
    • 5. 优化查询
    • 6. 检查并发连接和系统资源
    • 7. 进一步优化
    • 8. 查看某条SQL
      • 1. **如何生成 `query_id`**
      • 2. **`query_id` 是否会变化?**
      • 3. **是否会变动?**
      • 4. **为什么使用 `query_id`?**
      • 5. **`query_id` 与执行计划的关系**
      • 结论
    • 9.全表更新
    • 总结

PostgreSQL 慢查询优化与 pg_stat_statements 使用

在 PostgreSQL 中,优化慢查询的过程通常包括启用慢查询日志、收集慢查询信息、分析查询执行计划并进行查询优化。以下是如何有效地识别和优化 PostgreSQL 中的慢查询的步骤:


1. 启用慢查询日志

首先,确认慢查询日志是否已启用。可以通过查询 pg_settings 视图来检查 log_min_duration_statement 的值。如果该值为 -1,表示慢查询日志未开启。你可以将其设置为一个正数值(以毫秒为单位),例如5000毫秒,以记录执行时间超过5秒的查询。

-- 查看当前的设置
SELECT name, setting FROM pg_settings WHERE name = 'log_min_duration_statement';

-- 启用慢查询日志,设置为 5000 毫秒(即超过 5 秒的查询将被记录)
SET log_min_duration_statement = 5000;

通过开启慢查询日志,你可以捕获到所有执行时间超过 5 秒的查询。


2. 使用 pg_stat_statements 扩展收集查询统计信息

pg_stat_statements 是 PostgreSQL 的一个扩展,用于收集所有 SQL 查询的执行统计信息。确保该扩展已经启用:

-- 启用扩展
CREATE EXTENSION pg_stat_statements;

启用后,可以使用以下查询来查看所有查询的统计信息,包括查询文本、执行时间、执行次数等:

SELECT * FROM pg_stat_statements;

3. 查找执行时间较长的查询

使用 pg_stat_statements 查看执行时间超过 5 秒(5000 毫秒)的查询,帮助识别慢查询:

SELECT query, 
       total_exec_time, 
       calls, 
       mean_exec_time
FROM pg_stat_statements
WHERE total_exec_time > 5000;

解释:

  • total_exec_time:查询的总执行时间(以毫秒为单位)。
  • calls:该查询的执行次数。
  • mean_exec_time:每次执行的平均时间。

这样可以快速找出耗时较长的查询,便于进一步优化。


4. 分析慢查询的执行计划

对于识别出的慢查询,使用 EXPLAIN ANALYZE 命令来分析查询的执行计划,帮助找出性能瓶颈:

EXPLAIN ANALYZE SELECT * FROM your_table WHERE some_column = 'value';

该命令会显示查询的执行计划,包括查询操作类型、扫描方式、使用的索引等信息,并提供执行的详细时间数据。通过分析执行计划,可以判断查询是否存在不必要的全表扫描、是否缺少索引等问题。


5. 优化查询

根据 EXPLAIN ANALYZE 的分析结果,考虑以下优化策略:

  • 添加索引:为查询中的筛选条件添加索引,减少全表扫描。
  • 重写查询:优化查询结构,避免使用复杂的子查询或者非必要的联接。
  • 数据分区:对于非常大的表,可以考虑使用表分区来提高查询性能。
  • 优化配置:调整 PostgreSQL 的配置参数,如 work_memshared_buffers 等,来提高查询性能。

6. 检查并发连接和系统资源

有时慢查询的原因不仅仅在于查询本身,还可能是由于系统资源的瓶颈或过多的并发连接。通过以下查询,可以监控当前的并发连接和数据库活动:

-- 查看当前正在运行的查询
SELECT * FROM pg_stat_activity WHERE state = 'active';

-- 查看锁的信息,检查是否存在锁等待
SELECT * FROM pg_locks WHERE granted = 'f';

这些查询可以帮助你了解是否有大量的并发连接或者锁竞争导致查询变慢。


7. 进一步优化

  • 定期清理表碎片:对于经常更新的表,可以定期使用 VACUUMANALYZE 来清理死锁和统计信息,保持查询性能。

    -- 清理表碎片
    VACUUM ANALYZE your_table;
    
  • 调整数据库配置:根据查询分析的结果,调整 PostgreSQL 的配置文件(如 postgresql.conf)中的参数,以优化数据库性能。例如,增加 shared_bufferswork_mem 以提高内存使用。


8. 查看某条SQL

select query_id,query from pg_stat_statements where query like 'xxxx%';
select min_exec_time,max_exec_time,query from pg_stat_statements where query_id=xxxxx;

在 PostgreSQL 中,query_id 是由 pg_stat_statements 视图中的一个字段,主要用于唯一标识查询的内容。query_id 是由 PostgreSQL 自动生成的,它是基于查询文本的哈希值,因此它有以下特点:

1. 如何生成 query_id

query_id 是通过对查询文本进行哈希运算生成的。具体来说,PostgreSQL 使用一种加密哈希算法(如 pg_catalog.pg_stat_statements_hash)来计算查询文本的哈希值。这个哈希值用于标识相同的查询,即使查询的执行计划或执行环境不同,只要查询文本相同,query_id 也是相同的。

2. query_id 是否会变化?

query_id 的变化主要取决于以下几个因素:

  • 查询文本变化:如果查询文本发生变化,例如查询的字段、表名、条件、排序方式等发生了变化,生成的哈希值就会变化,从而导致 query_id 发生变化。

    例如,下面两个查询的 query_id 会不同:

    SELECT * FROM users WHERE name = 'Alice';
    SELECT * FROM users WHERE name = 'Bob';
    

    这两个查询虽然可能有相同的执行计划,但是由于查询条件不同,它们的 query_id 是不同的。

  • SQL 中的常量或其他变动:即使查询本身的结构相同,但如果查询中使用了常量值(例如 SELECT * FROM users WHERE id = 10SELECT * FROM users WHERE id = 20),query_id 也会不同。

3. 是否会变动?

  • 相同查询,query_id 不变:如果查询的文本完全相同(例如查询条件、字段、表等相同),则 query_id 是一致的。

  • 查询文本变化,query_id 变动:如果查询的文本有所变化,query_id 也会发生变化。

  • 执行环境或计划不影响 query_id:虽然查询的执行计划、执行时间等可能会因数据库的状态或其他因素有所不同,但这些因素并不影响 query_id 的生成。query_id 只依赖于查询文本。

4. 为什么使用 query_id

query_id 主要用于统计和优化目的。在 PostgreSQL 中,pg_stat_statements 会记录查询的执行统计信息,包括执行次数、总执行时间等。query_id 作为唯一标识符,帮助 PostgreSQL 将具有相同查询文本的查询合并为一个统计条目,以便更高效地跟踪和分析查询性能。

5. query_id 与执行计划的关系

query_id 只与查询的 文本 相关,而与查询的 执行计划数据库状态 无关。即使查询的执行计划或数据库状态发生变化,只要查询文本不变,query_id 也不会变化。这意味着,即使查询的性能发生了变化,query_id 仍然保持不变。

结论

query_id 是基于查询文本的哈希值生成的,并且是唯一且不变的,只要查询文本相同,query_id 就不会变化。因此,query_id 可以帮助 PostgreSQL 将相同查询的执行统计信息聚合到一起,从而更有效地进行性能分析。如果查询文本发生变化(如修改了查询条件或字段),query_id 会发生变化。


9.全表更新

在 PostgreSQL 中,执行全表更新(UPDATE)时,通常会对被修改的每一行加上行级锁,以防止其他事务同时修改相同的行。
这意味着,虽然 UPDATE 操作本身是行级锁,但如果没有适当的索引,查询可能会导致全表扫描,从而影响性能。
此外,频繁的全表更新可能导致大量的死锁,影响数据库的并发性能。
因此,建议在 UPDATE 操作中使用适当的索引,以提高查询效率,并避免频繁的全表更新,以减少死锁的风险。

总结

通过启用慢查询日志、使用 pg_stat_statements 收集查询统计、分析执行计划、优化查询和调整数据库配置,可以有效地识别和优化 PostgreSQL 中的慢查询,提高数据库的整体性能。

希望这个结构清晰、详细的笔记能帮助你更好地理解和解决 PostgreSQL 中的慢查询问题。

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

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

相关文章

【Rust中级教程】2.8. API设计原则之灵活性(flexible) Pt.4:显式析构函数的问题及3种解决方案

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 说句题外话,这篇文章一共5721个字,是我截至目前写的最长的一篇文章&a…

【复习】Redis

数据结构 Redis常见的数据结构 String&#xff1a;缓存对象Hash&#xff1a;缓存对象、购物车List&#xff1a;消息队列Set&#xff1a;点赞、共同关注ZSet&#xff1a;排序 Zset底层&#xff1f; Zset底层的数据结构是由压缩链表或跳表实现的 如果有序集合的元素 < 12…

STM32使用NRF2401进行数据传送

NRF2401是一款由Nordic Semiconductor公司生产的单片射频收发芯片&#xff0c;以下是关于它的详细介绍&#xff1a; 一、主要特点 工作频段&#xff1a;NRF2401工作于2.4~2.5GHz的ISM&#xff08;工业、科学和医疗&#xff09;频段&#xff0c;该频段无需申请即可使用&#xf…

DeepSeek、微信、硅基流动、纳米搜索、秘塔搜索……十种不同方法实现DeepSeek使用自由

为了让大家实现 DeepSeek 使用自由&#xff0c;今天分享 10 个畅用 DeepSeek 的平台。 一、官方满血版&#xff1a;DeepSeek官网与APP 首推&#xff0c;肯定是 DeepSeek 的官网和 APP&#xff0c;可以使用满血版 R1 和 V3 模型&#xff0c;以及联网功能。 网址&#xff1a; htt…

Orange 开源项目 - 集成阿里云大模型

1 阿里云的大模型服务平台百炼 阿里云的大模型服务平台百炼是一站式的大模型开发及应用构建平台。不论是开发者还是业务人员&#xff0c;都能深入参与大模型应用的设计和构建。您可以通过简单的界面操作&#xff0c;在5分钟内开发出一款大模型应用&#xff0c;或在几小时内训练…

公开整理-最新中国城市统计NJExcel+PDF版本(1985-2024年)

数据简介&#xff1a;《中国城市统计NJ》从1985年开始&#xff0c;本NJ内容共分四个部分:第一部分是全国城市行政区划,列有不同区域、不同级别的城市分布情况;第二、三部分分别是地级以上城市统计资料和县级城市统计资料,具体包括人口、劳动力及土地资源、综合经济、工业、交通…

KubeSphere平台安装

KubeSphere简介 KubeSphere 是一款功能强大的容器管理平台&#xff0c;以下是其简介&#xff1a; 1&#xff09;基本信息 开源项目&#xff1a;基于 Apache-2.0 授权协议开源&#xff0c;由 Google Go、Groovy、HTML/CSS 和 Shell 等多种编程语言开发。基础架构&#xff1a;…

Claude 3.7 Sonnet 泄露,Anthropic 最先进 AI 模型即将在 AWS Bedrock 上首次亮相

(图片&#xff1a;AWS) Anthropic 旗下先进的 AI 模型 Claude 3.7 Sonnet 似乎即将发布。业界预计&#xff0c;亚马逊可能会在2025年2月26日的活动中公布相关消息。泄露的信息表明&#xff0c;该模型将托管于 AWS Bedrock 平台&#xff0c;该平台以提供尖端 AI 模型访问而闻名…

ONNX转RKNN的环境搭建和部署流程

将ONNX模型转换为RKNN模型的过程记录 工具准备 rknn-toolkit:https://github.com/rockchip-linux/rknn-toolkit rknn-toolkit2:https://github.com/airockchip/rknn-toolkit2 rknn_model_zoo:https://github.com/airockchip/rknn_model_zoo ultralytics_yolov8:https://github…

Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机

Linux红帽&#xff1a;RHCSA认证知识讲解&#xff08;二&#xff09;配置网络与登录本地远程Linux主机 前言一、使用命令行&#xff08;nmcli 命令&#xff09;配置网络&#xff0c;配置主机名第一步第二步修改主机名称 二、使用图形化界面&#xff08;nmtui 命令&#xff09;配…

深入浅出ES6:现代JavaScript的基石

ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的一次重大更新&#xff0c;引入了许多新特性&#xff0c;使JavaScript更加强大、优雅和易于维护。这些特性已经成为现代JavaScript开发的基石&#xff0c;掌握它们对于任何JavaScript开发者都至关重要。本文将深入…

小型字符级语言模型的改进方向和策略

小型字符级语言模型的改进方向和策略 一、回顾小型字符级语言模型的处理流程 前文我们已经从零开始构建了一个小型字符级语言模型,那么如何改进和完善我们的模型呢?有哪些改进的方向?我们先回顾一下模型的流程: 图1 小型字符级语言模型的处理流程 (1)核心模块交互过程:…

一周学会Flask3 Python Web开发-Jinja2模板访问对象

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 如果渲染模板传的是对象&#xff0c;如果如何来访问呢&#xff1f; 我们看下下面示例&#xff1a; 定义一个Student类 cla…

vue 3D 翻页效果

<template><view class"swipe-container" touchstart"onTouchStart" touchmove"onTouchMove" touchend"onTouchEnd"><view class"page">初始页</view></view> </template><script&g…

npm : 无法加载文件 E:\ProgramFiles\Nodejs\npm.ps1,因为在此系统上禁止运行脚本。

这个错误是因为 Windows 系统的 PowerShell 执行策略 限制了脚本的运行。默认情况下&#xff0c;PowerShell 的执行策略是 Restricted&#xff0c;即禁止运行任何脚本。以下是解决该问题的步骤&#xff1a; 1. 检查当前执行策略 打开 PowerShell&#xff08;管理员权限&#x…

pycharm 调试 debug 进入 remote_sources

解决办法1&#xff1a; pycharm函数跳转到remote_sources中的文件中_pycharm修改remotesource包存放地址-CSDN博客 file->settings->project structure将项目文件夹设为"Sources"&#xff08;此时文件夹会变为蓝色&#xff09;。 解决方法2 Debug:使用Pychar…

测试面试题:以一个登录窗口为例,设计一下登录界面测试的思路和方法

在测试登录窗口时,可以从 表单测试、 逻辑判断和 业务流程三个方面设计测试思路和方法。以下是一个详细的测试方案: 1. 表单测试 表单测试主要关注输入框、按钮等UI元素的正确性和用户体验。 测试点: 输入框测试 用户名和密码输入框是否正常显示。输入框是否支持预期的字符类…

【蓝桥杯】1.k倍区间

前缀和 #include <iostream> using namespace std; const int N100010; long long a[N]; int cnt[N]; int main(){int n, m;cnt[0] 1;cin >> n >> m;long long res 0;for(int i 1; i < n; i){scanf("%d", &a[i]);a[i] a[i-1];res cnt…

机器人部分专业课

华东理工 人工智能与机器人导论 Introduction of Artificial Intelligence and Robots 必修 考查 0.5 8 8 0 1 16477012 程序设计基础 The Fundamentals of Programming 必修 考试 3 64 32 32 1 47450012 算法与数据结构 Algorithm and Data Structure 必修 考试 3 56 40 …

Maven——Maven开发经验总结(1)

摘要 本文总结了 Maven 开发中的多个关键经验&#xff0c;包括如何根据版本号决定推送到 releases 或 snapshots 仓库&#xff0c;如何在构建过程中跳过测试&#xff0c;父项目如何控制子项目依赖版本&#xff0c;父项目依赖是否能传递到子项目&#xff0c;如何跳过 Maven dep…