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)。

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

相关推荐
光蛋24 分钟前
Docker Compose 助力阿里云 Linux 3 PostgreSQL 高可用部署
postgresql
IvorySQL4 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
Shi_haoliu4 小时前
python安装操作流程-FastAPI + PostgreSQL简单流程
python·postgresql·fastapi
符哥20085 小时前
Ubuntu 常用指令集大全(附实操实例)
数据库·ubuntu·postgresql
l1t7 小时前
DeepSeek总结的PostgreSQL解码GIF文件SQL移植到DuckDB的性能优化方法
sql·postgresql·性能优化
数据知道8 小时前
PostgreSQL 性能优化:分区表实战
数据库·postgresql·性能优化
数据知道9 小时前
PostgreSQL 性能优化:如何提高数据库的并发能力?
数据库·postgresql·性能优化
数据知道9 小时前
PostgreSQL性能优化:内存配置优化(shared_buffers与work_mem的黄金比例)
数据库·postgresql·性能优化
数据知道9 小时前
PostgreSQL 性能优化:连接数过多的原因分析与连接池方案
数据库·postgresql·性能优化
数据知道9 小时前
PostgreSQL性能优化:如何定期清理无用索引以释放磁盘空间(索引膨胀监控)
数据库·postgresql·性能优化