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

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

相关推荐
有想法的py工程师9 小时前
PostgreSQL 分区表 + Debezium CDC:为什么 REPLICA IDENTITY FULL 不生效?
数据库·postgresql
TFATS9 小时前
Nvidia H100 算力服务器 Cuda Fabric Manager 升级
服务器·postgresql·fabric
p&f°9 小时前
PostgreSQL 执行计划控制参数详解
数据库·postgresql·oracle
总有刁民想爱朕ha1 天前
银河麒麟v10服务器版Docker部署PostgreSQL 14教程
docker·postgresql·容器·银河麒麟服务器版v10
【上下求索】1 天前
学习笔记096——Windows postgreSQL-18.1[压缩包版本]
windows·笔记·学习·postgresql
jingyucsdn1 天前
将postgresql结构和数据备份成sql语句
数据库·sql·postgresql
ChristXlx1 天前
Linux安装MongoDB(虚拟机适用)
linux·mongodb·postgresql
yfs10241 天前
PostgreSQL 16 + pgvector 完整安装和内网访问指南(Ubuntu 20.04)
数据库·ubuntu·postgresql