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

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

相关推荐
梦想画家1 天前
实战优化:基于 pgvector 的向量存储与检索效率提升全攻略
postgresql·pgvector·语义检索
AC赳赳老秦1 天前
Python 爬虫进阶:DeepSeek 优化反爬策略与动态数据解析逻辑
开发语言·hadoop·spring boot·爬虫·python·postgresql·deepseek
horizon72741 天前
Windows安装pgvector
postgresql·pgvector
l1t1 天前
DeepSeek辅助编写的利用唯一可选数求解数独SQL
数据库·sql·算法·postgresql
XMYX-01 天前
CentOS 7 搭建 PostgreSQL 14 实战指南
linux·postgresql·centos
a努力。2 天前
中国电网Java面试被问:分布式缓存的缓存穿透解决方案
java·开发语言·分布式·缓存·postgresql·面试·linq
Vic101012 天前
华为云高斯数据库:gsqlexec用法
java·大数据·数据库·postgresql·华为云
odoo中国2 天前
Pgpool-II 在 PostgreSQL 中的用例场景与优势
数据库·postgresql·中间件·pgpool
男孩李2 天前
postgres数据库常用命令介绍
数据库·postgresql
IvorySQL2 天前
让源码安装不再困难:IvorySQL 一键安装脚本的实现细节解析
数据库·人工智能·postgresql·开源