PgSQL高级用法

1. HAVING 和 WHERE 的区别

WHEREHAVING都是用于过滤数据的子句,但它们的核心区别在于作用时机操作对象不同 。

  • WHERE子句

    • 作用时机 :在分组(GROUP BY)和聚合计算之前过滤数据行。

    • 操作对象:针对来自表的原始数据行。

    • 限制不能 直接使用聚合函数(如 SUM, COUNT, AVG等),因为它需要在聚合计算之前确定哪些行参与计算。如果需要使用聚合条件过滤行,通常要借助子查询 。

  • HAVING子句

    • 作用时机 :在分组(GROUP BY)和聚合计算之后过滤数据。

    • 操作对象 :针对由 GROUP BY形成的分组。

    • 特点:几乎总是与聚合函数一起使用,用于筛选满足特定条件的分组结果 。

简单总结WHERE是决定哪些数据行可以进入分组聚合阶段;HAVING是决定哪些分组结果可以最终呈现 。一个查询中可以同时使用两者,WHERE先执行,HAVING后执行 。

2. 复合索引 (a, b, c) 的查询加速效果

对于在列 (a, b, c) 上创建的复合索引(多列索引),其效果遵循 最左前缀匹配原则​ 。

  • 单独查询 a (WHERE a = ...)有加速效果 。因为索引的第一列就是 a,查询可以直接利用索引的有序性进行快速查找 。

  • 查询 a 和 b (WHERE a = ... AND b = ...)有加速效果,且效果通常更好。查询条件完全匹配了索引的前两列,可以更精确地利用索引定位数据 。

  • 注意事项 :如果查询条件中不包含 最左列 a(例如直接查询 WHERE b = ...WHERE c = ...),那么这个 (a, b, c) 复合索引在大多数情况下将不会被使用(除非是覆盖索引等特殊情况),数据库可能会选择全表扫描或其他索引 。

3. 什么是慢查询

慢查询通常指的是执行时间超过预设阈值的 SQL 查询语句 。

  • 定义:数据库系统中,当一个 SQL 语句的执行时间超过某个指定值(例如,PostgreSQL 中常默认设置为 1 秒)时,这个 SQL 就被称为慢查询或慢 SQL 。

  • 重要性:慢查询是数据库性能优化的关键切入点。分析慢查询可以帮助定位性能瓶颈,例如是否缺少索引、SQL 写法不佳、硬件资源不足等 。

  • 查看方法

    • 在 PostgreSQL 中,可以通过设置 log_min_duration_statement参数来记录慢 SQL 到日志文件中 。

    • 可以查询 pg_stat_activity系统视图来查看当前正在执行的、运行时间过长的 SQL 语句 。

    • 一些云数据库管理控制台会提供更直观的慢查询分析界面和统计信息 。

4. PostgreSQL 的死锁问题

死锁是数据库系统中两个或更多事务相互等待对方释放锁资源,导致所有事务都无法继续执行的状态 。

  • 如何排查死锁

    1. 查询当前活动进程 :使用 SELECT * FROM pg_stat_activity WHERE datname = 'your_database_name';查看数据库当前活动连接 。

    2. 查询锁信息 :通过关联 pg_lockspg_class系统表,查看当前哪些关系(如表)上存在锁,以及锁的模式和持有者 。

      sql 复制代码
      SELECT a.locktype, a.database, a.pid, a.mode, a.relation, b.relname
      FROM pg_locks a
      JOIN pg_class b ON a.relation = b.oid
      WHERE b.relname = 'your_table_name';
  • 解决死锁:找到导致死锁的进程 ID (PID) 后,可以使用以下命令终止该进程:

    • SELECT pg_cancel_backend(pid);-- 相对温和,尝试取消查询

    • SELECT pg_terminate_backend(pid);-- 更强力,直接终止整个后端进程。注意后者对 DROP TABLE等操作也有效 。

  • 避免死锁的实战建议

    • 尽量保持事务小巧且执行迅速。

    • 为表设计合理的索引,避免全表扫描升级为表锁。

    • 如果业务允许,可以考虑使用较低的隔离级别(如 Read Committed)。

    • 在应用程序中,尽量以相同的顺序访问多个资源(表、行),以减少循环等待的可能 。

相关推荐
smallyoung1 天前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·mysql·postgresql
秉承初心16 天前
PostgreSQL 数据性能瓶颈突破实战
数据库·postgresql·oracle
IvorySQL17 天前
PostgreSQL 技术日报 (6月15日)|PG19 性能优化推进,POSETTE 大会倒计时 2 天
数据库·人工智能·postgresql·开源
IvorySQL17 天前
PostgreSQL 技术日报 (6月16日)|Neon 自动化再进一步,逻辑复制冲突日志迎来 v50 更新
数据库·postgresql·自动化
倒流时光三十年17 天前
PostgreSQL 聊一下索引和排序规则
postgresql
睡不醒男孩03082317 天前
PostgreSQL 数据库运维转型:从传统模式到 CLup 平台的 25 个核心 FAQ
运维·数据库·postgresql
JOJO数据科学18 天前
pgAdmin4 Electron 鸿蒙 PC 适配全记录:从白屏到连接 PostgreSQL
postgresql·electron·harmonyos
日取其半万世不竭18 天前
PostgreSQL 跑在 Docker 里怎么备份?恢复成功才算备份成功
数据库·docker·postgresql
倒流时光三十年18 天前
PostgreSQL LEAST 表达式函数详解
数据库·postgresql
Rain50918 天前
2.4. PostgreSQL 数据库连接与实战指南
前端·数据库·人工智能·后端·postgresql·数据分析