暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

从新手到专家:PostgreSQL面试经常问到的50个问题

点击上方蓝字,关注我们


想学会更多实用技巧,欢迎加入青学会MOP技术社区(实名社区)。

加入方法:公众号后台回复关键字“加入”获取小助手微信,添加后登记入会。

同时欢迎大家在评论区留言互动交流!社区会不定期举行相关的抽奖、公开分享活动。

如果你有想了解的知识点希望我们发文可以后台私信。

最近联合几个 Oracle ACE技术专家 开通了一个付费微信群,都是具有10多年金融、医疗、制造业10年以上的一线专家,坑位费399/人,无限期,目前群内近165。加群后会有一些福利(分享各类技术文档,干货资源,问题解答等等),更有特邀嘉宾会定期在群内直播,解读AWR,快问快答等!有问题我们尽量都解答,毕竟399不能都解决所有问题。有兴趣联系微:ywu0613

内部知识库正在筹建中,不止有oracle!


正文开始

PostgreSQL作为一款强大的开源数据库,广泛应用于企业级系统中。日常维护和性能优化是每个数据库管理员和开发者的必修课。本文整理了50道PostgreSQL初中级笔试题,涵盖VACUUM操作、索引管理、并行查询、缓冲区缓存等核心知识点,旨在帮助读者快速掌握数据库管理的基础技能。无论你是准备面试还是提升实战能力,这些问题都将为你提供清晰的指引。

1. 什么是VACUUM命令?

  • 答: VACUUM命令用于回收PostgreSQL数据库中被删除或更新数据占用的空间,并将其标记为可重用。它有两种形式:VACUUM和VACUUM FULL。

2. VACUUM和VACUUM FULL的区别是什么?

  • 答: VACUUM标记删除的空间为可重用但不释放给操作系统;VACUUM FULL物理释放空间给操作系统,并重新组织表数据。

3. 在什么情况下建议使用VACUUM FULL?

  • 答: 当表磁盘页面占有量接近临界值且需释放空间时,建议在数据操作较少的时间段使用VACUUM FULL。

4. VACUUM命令会锁表吗?

  • 答: VACUUM使用共享锁,可与其他操作并行;VACUUM FULL使用排他锁,会锁定表,阻止其他操作。

5. 什么是dead tuple?

  • 答: dead tuple是被删除或更新后不再使用的旧版本行,占用空间但不可见。

6. 如何监控表中的dead tuple数量?

  • 答: 使用查询:SELECT relname, n_dead_tup, n_live_tup FROM pg_stat_user_tables;

7. pgstattuple模块有什么作用?

  • 答: pgstattuple模块提供元组级别的统计信息,用于分析表和索引的膨胀情况。

8. 如何查看表的索引名称和磁盘页面数?

  • 答: 使用查询:SELECT c2.relname, c2.relpages FROM pg_class c, pg_class c2, pg_index i WHERE c.relname = 'table_name' AND c.oid = i.indrelid AND c2.oid = i.indexrelid;

9. 什么是膨胀表,如何维护?

  • 答: 膨胀表是因频繁更新或删除导致空间大于实际需求的表。维护方法包括定期VACUUM、VACUUM FULL,或使用pg_repack工具。

10. 如何查找未使用的索引?

  • 答: 使用查询:SELECT s.relname, indexrelname, idx_scan FROM pg_stat_user_indexes s, pg_index i WHERE i.indexrelid = s.indexrelid AND idx_scan = 0;

11. 如何查找重复索引?

  • 答: 使用查询:SELECT indrelid::regclass, att.attname FROM pg_index i, pg_class c, pg_attribute att WHERE c.oid = i.indrelid AND att.attrelid = c.oid AND att.attnum = ANY(i.indkey) GROUP BY 1, 2 HAVING count(*) > 1;

12. 如何检查表或索引的膨胀情况?

  • 答: 使用pgstattuple模块,如SELECT * FROM pgstattuple('table_name');
    ,或运行膨胀检查脚本计算膨胀倍数。

13. 什么是表的年龄,如何查询?

  • 答: 表的年龄是表事务ID与当前事务ID的差值。查询:SELECT c.oid::regclass, greatest(age(c.relfrozenxid), age(t.relfrozenxid)) FROM pg_class c LEFT JOIN pg_class t ON c.reltoastrelid = t.oid;

14. 如何减少VACUUM对查询的影响?

  • 答: 设置vacuum_cost_delay
    为较高值(如50ms),减缓VACUUM执行速度。

15. 什么是PostgreSQL单用户模式?

  • 答: 单用户模式是以单用户方式启动数据库,用于维护和修复,如执行VACUUM或修复系统表。

16. 如何进入单用户模式?

  • 答: 使用命令:postgres --single -D $PGDATA

17. 什么是.pgpass文件?

  • 答: .pgpass文件存储数据库连接密码,支持自动登录,方便脚本执行管理任务。

18. .pgpass文件的格式是什么?

  • 答: 格式为:hostname:port:database:username:password

19. 如何设置.pgpass文件权限?

  • 答: 在Unix系统上,使用chmod 0600 ~/.pgpass
    限制仅文件所有者可读写。

20. VACUUM FULL执行时会做什么?

  • 答: VACUUM FULL重建数据文件,将可用数据导入新文件,删除旧文件,并释放空间给操作系统。

21. 为什么需要定期执行VACUUM?

  • 答: 定期VACUUM可回收dead tuple,防止表膨胀,保持查询性能。

22. 什么是dead tuple比率,如何计算?

  • 答: dead tuple比率是dead tuple占总tuple的百分比。计算:round(n_dead_tup * 100 / (n_live_tup + n_dead_tup), 2)

23. 如何查看表的物理页面数?

  • 答: 使用查询:SELECT relpages FROM pg_class WHERE relname = 'table_name';

24. pgstattuple中的table_len
是什么?

  • 答: table_len
    是表的物理长度,以字节为单位。

25. 如何使用pgstattuple查看表统计信息?

  • 答: 执行:SELECT * FROM pgstattuple('table_name');

26. 什么是索引膨胀,如何检查?

  • 答: 索引膨胀是索引占用空间大于实际需求。使用pgstattuple检查free_space
    free_percent

27. 如何重建索引以减少膨胀?

  • 答: 使用命令:REINDEX INDEX index_name;

28. 什么是并行查询?

  • 答: 并行查询是PostgreSQL 9.6+支持的功能,允许多进程并行执行查询,提升性能。

29. 如何启用并行查询?

  • 答: 设置max_parallel_workers_per_gather
    大于0。

30. 并行查询适用于哪些场景?

  • 答: 适用于大数据量全表扫描、聚合等CPU密集型任务。

31. 什么是缓冲区高速缓存?

- **答:** 缓冲区高速缓存是PostgreSQL内存区域,用于缓存频繁访问的数据页,提升访问速度。

  1. 如何查看缓冲区缓存使用情况?
  • 答: 使用pg_buffercache扩展,查询pg_buffercache
    视图。

33. 什么是脏页?

  • 答: 脏页是缓冲区中已修改但未写回磁盘的数据页。

34. 如何查看缓冲区中的脏页数量?

  • 答: 查询:SELECT count(*) FROM pg_buffercache WHERE isdirty;

35. 检查点(checkpoint)的目的是什么?

  • 答: 检查点将缓冲区中的脏页写回磁盘,确保数据一致性。

36. 如何手动触发检查点?

  • 答: 执行:CHECKPOINT;

37. pg_prewarm扩展的作用是什么?

  • 答: pg_prewarm将表数据预加载到缓冲区缓存,提升后续查询性能。

38. 如何使用pg_prewarm预热表?

  • 答: 执行:SELECT pg_prewarm('table_name');

39. 什么是HOT更新?

  • 答: HOT(Heap Only Tuple)更新是一种优化技术,允许不更新索引的情况下更新行,减少开销。

40. HOT更新的条件是什么?

  • 答: 更新不修改索引列,且新旧行在同一数据页。

41. 如何查看表页面信息?

  • 答: 使用pageinspect扩展,如:SELECT * FROM page_header(get_raw_page('table_name', 0));

42. REINDEX命令的作用是什么?

  • 答: REINDEX重建索引,减少空间占用并提升查询性能。

43. REINDEX CONCURRENTLY有什么作用?

  • 答: REINDEX CONCURRENTLY允许在线重建索引,不阻塞DML操作(PostgreSQL 12+)。

44. 如何查看数据库的年龄?

  • 答: 查询:SELECT datname, age(datfrozenxid) FROM pg_database;

45. 什么是事务ID回绕?

  • 答: 事务ID达到最大值后回绕到0,可能导致数据不一致,需定期VACUUM FREEZE预防。

46. 如何设置VACUUM FREEZE的阈值?

  • 答: 设置参数vacuum_freeze_table_age
    vacuum_freeze_min_age

47. .pgpass文件中的通配符是什么?

  • 答: 使用“*”匹配hostname、port、database、username中的任意值(密码除外)。

48. 如何在Windows上设置PGPASSFILE环境变量?

  • 答: 设置如:set PGPASSFILE=C:\path\to\pgpass.conf

49. VACUUM FULL和TRUNCATE的区别是什么?

  • 答: VACUUM FULL重建表并释放空间,保留数据;TRUNCATE删除所有数据并释放空间,保留表结构。

50. 如何监控并行查询的执行情况?

  • 答: 查看执行计划中的Workers Planned
    Workers Launched
    Parallel Seq Scan
    等字段。

PostgreSQL的强大离不开科学的管理方法。通过这50道题,你不仅能夯实基础,还能为面试或实战积累信心。快来测试一下,看看你能答对多少吧!欢迎关注我们,获取更多数据库优化干货。


END

往期文章回顾

MOP社区新闻

  青学会MOP技术社区成立了!

  青学会专家顾问团成员介绍

金仓专栏

  告别繁琐!KingbaseES v9数据库一键安装-青学会&金仓专栏(1)

  KingbaseES v9数据库Docker安装-青学会&金仓专栏(2)

  KingbaseES数据脱敏-青学会&金仓专栏(3)

  KingbaseES后台服务管理-青学会&金仓专栏(4)

  电科金仓KES日常运维命令集锦-青学会&金仓专栏(5)

DBA实战小技巧

  推荐一款超实用的openGauss数据库安装工具!

  实战:记一次RAC故障排查
  DBA实战运维小技巧安装篇(一)Oracle 主流版本不同架构下的静默安装指南
  DBA实战运维小技巧存储篇(一)根目录满了如何处理
  DBA实战运维小技巧存储篇(二)打包迁移单机数据库至新存储

MOP社区投稿-内核开发

  浅谈 PostgreSQL GUC 模块原理

  简单解析 IvorySQL 增强 Oracle xml 兼容能力的原理

  简单讨论 PostgreSQL C语言拓展函数返回数据表的方式

  简单分析 pg_config 程序的作用与原理
  Redis 日志机制简介(一):SlowLog
  Redis 日志机制简介(二):AOF 日志
  Redis 日志机制简介(三):RDB 日志
  pg_cron插件使用介绍
  Redis 的指令表实现机制简介
  pg几款源码工具介绍
  Redis 事务功能简介

MOP顾问说

   MOP顾问说:MOP 三种主流数据库常用 SQL(一)

  MOP顾问说: 服务器内存

  MOP 顾问说:Linux Nice 值与 CPU 优先级揭秘


文章转载自青年数据库学习互助会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论