
想学会更多实用技巧,欢迎加入青学会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内存区域,用于缓存频繁访问的数据页,提升访问速度。
如何查看缓冲区缓存使用情况?
答: 使用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道题,你不仅能夯实基础,还能为面试或实战积累信心。快来测试一下,看看你能答对多少吧!欢迎关注我们,获取更多数据库优化干货。
往期文章回顾
MOP社区新闻
金仓专栏
告别繁琐!KingbaseES v9数据库一键安装-青学会&金仓专栏(1)
KingbaseES v9数据库Docker安装-青学会&金仓专栏(2)
DBA实战小技巧
实战:记一次RAC故障排查
DBA实战运维小技巧安装篇(一)Oracle 主流版本不同架构下的静默安装指南
DBA实战运维小技巧存储篇(一)根目录满了如何处理
DBA实战运维小技巧存储篇(二)打包迁移单机数据库至新存储
MOP社区投稿-内核开发
简单解析 IvorySQL 增强 Oracle xml 兼容能力的原理
简单讨论 PostgreSQL C语言拓展函数返回数据表的方式
简单分析 pg_config 程序的作用与原理
Redis 日志机制简介(一):SlowLog
Redis 日志机制简介(二):AOF 日志
Redis 日志机制简介(三):RDB 日志
pg_cron插件使用介绍
Redis 的指令表实现机制简介
pg几款源码工具介绍
Redis 事务功能简介




