MVCC、WAL、Vacuum 与统计信息
101 PostgreSQL MVCC 的核心思想是?
难度: 基础
- A. 更新时保留旧版本,读者按快照选择可见版本,读不阻塞写
- B. 更新直接覆盖旧行并加全表锁
- C. 所有读写都排队串行
- D. 版本链只保存在内存中
查看答案与解析
正确答案A
正确原因: MVCC 让读写并发互不阻塞,通过版本可见性实现隔离。
关键边界: 旧版本需要 VACUUM 回收,长事务会阻碍回收。
错误选项辨析: 覆盖行会破坏快照,串行化失去并发,版本保存在堆文件中。
102 UPDATE 一行后,旧行版本会怎样?
难度: 基础
- A. 变成死元组(dead tuple),等待 VACUUM 回收
- B. 立即从磁盘删除
- C. 移动到另一张表
- D. 永久保留且占用不变
查看答案与解析
正确答案A
正确原因: 更新产生新版本,旧版本对旧快照仍可见,标记为死元组。
关键边界: 死元组占用空间,由 VACUUM 清理。
错误选项辨析: 不立即删除,不迁移,若不清理会持续膨胀。
103 VACUUM 的主要作用是?
难度: 基础
- A. 重写整张表并压缩文件
- B. 回收死元组空间并更新可见性映射,供旧快照外的查询复用
- C. 删除用户数据
- D. 重建所有索引
查看答案与解析
正确答案B
正确原因: 常规 VACUUM 原地清理死元组,更新统计与可见性映射。
关键边界: 空间回收给表内部复用,文件不一定变小。
错误选项辨析: 重写表是 VACUUM FULL,VACUUM 不删用户数据、不重建索引。
104 autovacuum 的作用是?
难度: 基础
- A. 自动删除重复数据
- B. 后台自动执行 VACUUM 与 ANALYZE,维持表健康
- C. 自动优化所有 SQL
- D. 自动备份数据库
查看答案与解析
正确答案B
正确原因: autovacuum 守护进程按阈值自动清理死元组并更新统计。
关键边界: 高更新场景可能需要调整触发参数。
错误选项辨析: 它不删数据、不重写 SQL、不做备份。
105 VACUUM FULL 与普通 VACUUM 的区别是?
难度: 进阶
- A. 两者完全相同
- B. VACUUM FULL 更轻量
- C. VACUUM FULL 重写表并回收磁盘空间,但会锁表
- D. 普通 VACUUM 会锁表重写
查看答案与解析
正确答案C
正确原因: VACUUM FULL 重建表文件,空间还给操作系统,代价是持锁阻塞。
关键边界: 大表用 VACUUM FULL 前要评估停机窗口。
错误选项辨析: 两者机制不同,VACUUM FULL 更重,普通 VACUUM 不重写文件。
106 事务冻结与 age 的目的是?
难度: 进阶
- A. 加速普通查询
- B. 缩小表体积
- C. 防止事务 ID 回卷(wraparound)导致的数据损坏
- D. 加密事务日志
查看答案与解析
正确答案C
正确原因: 事务 ID 有限,冻结旧事务并推进 age 避免回卷。
关键边界: 监控 datfrozenxid 与 age,必要时强制 VACUUM。
错误选项辨析: 冻结与查询速度、表体积、加密无关。
107 长事务对 VACUUM 的影响是?
难度: 实战
- A. 长事务让 VACUUM 更快
- B. 长事务自动触发 VACUUM FULL
- C. VACUUM 会中止长事务
- D. 事务快照使旧版本仍然可见,VACUUM 无法回收这些死元组
查看答案与解析
正确答案D
正确原因: VACUUM 只回收比最老活跃事务更早的版本,长事务拖住清理进度。
关键边界: 长事务还会导致表膨胀与事务 ID 老化。
错误选项辨析: 长事务阻碍清理,不触发重写,VACUUM 不终止事务。
108 WAL(Write-Ahead Logging)的原则是?
难度: 基础
- A. 先改数据页再记日志
- B. 日志只记录查询
- C. 日志写在内存即可
- D. 先写日志后写数据页,崩溃后可重放恢复
查看答案与解析
正确答案D
正确原因: WAL 保证数据页落后于日志时,崩溃恢复仍能补齐已提交事务。
关键边界: checkpoint 之后才允许安全清理旧日志。
错误选项辨析: 反序无法恢复,WAL 记录修改而非查询,日志必须持久化。
109 checkpoint 的作用是?
难度: 进阶
- A. 把脏页刷盘并推进重放起点,缩短崩溃恢复时间
- B. 删除旧的事务日志
- C. 锁定所有表
- D. 重建所有索引
查看答案与解析
正确答案A
正确原因: checkpoint 强制刷盘脏页,使恢复只需处理 checkpoint 之后的日志。
关键边界: 频繁 checkpoint 会放大 I/O,需平衡恢复速度与开销。
错误选项辨析: 它不删日志、不锁表、不重建索引。
110 ANALYZE 的作用是?
难度: 基础
- A. 收集表的统计信息,供优化器估算执行计划
- B. 清理死元组空间
- C. 重建索引
- D. 备份数据
查看答案与解析
正确答案A
正确原因: ANALYZE 更新 pg_statistic,规划器据此估算行数与成本。
关键边界: 数据分布变化大时要手动 ANALYZE,autovacuum 也会自动执行。
错误选项辨析: 清理是 VACUUM,索引重建是 REINDEX,备份是 pg_dump。
111 统计信息过期可能导致?
难度: 进阶
- A. 数据丢失
- B. 优化器估算错误,选择低效执行计划
- C. 表被锁定
- D. 索引自动删除
查看答案与解析
正确答案B
正确原因: 过旧统计让 rows 估算失真,可能选错连接算法或索引。
关键边界: 定期 ANALYZE 并观察计划变化。
错误选项辨析: 统计过期影响计划,不造成数据丢失或对象变更。
112 seq_page_cost 与 random_page_cost 的作用是?
难度: 进阶
- A. 设置磁盘容量上限
- B. 给顺序扫描与随机访问设定成本,影响索引与全表扫描的选择
- C. 控制连接数量
- D. 限制单条 SQL 长度
查看答案与解析
正确答案B
正确原因: 规划器用这两项成本估算扫描方式,随机读更贵则偏向顺序扫描。
关键边界: 固态盘可调低 random_page_cost 让索引更受青睐。
错误选项辨析: 它们是成本参数,与容量、连接、SQL 长度无关。
113 shared_buffers 的作用是?
难度: 基础
- A. 缓存查询结果集
- B. 存储 WAL 日志
- C. PostgreSQL 共享内存中的数据页与索引页缓存
- D. 保存用户密码
查看答案与解析
正确答案C
正确原因: shared_buffers 缓存数据页,减少磁盘访问,配合操作系统缓存工作。
关键边界: 不宜无限增大,需与系统内存与缓存命中率权衡。
错误选项辨析: 它缓存页而非结果集,WAL 与密码另有存储。
114 可见性映射(Visibility Map)的作用是?
难度: 进阶
- A. 加密数据页
- B. 记录页的访问次数
- C. 标记页内元组全部可见,让仅索引扫描免回表
- D. 替代所有索引
查看答案与解析
正确答案C
正确原因: 可见性映射由 VACUUM 维护,全可见页可被仅索引扫描直接使用。
关键边界: 更新会清除映射位,需要 VACUUM 重新标记。
错误选项辨析: 映射不加密、不计数、不替代索引。
115 HOT(Heap-Only Tuple)更新优化指的是?
难度: 进阶
- A. 热数据自动放到内存
- B. 更新必须重建全表
- C. 所有更新都免写日志
- D. 索引列未变时新版本留在原页,避免更新二级索引
查看答案与解析
正确答案D
正确原因: HOT 让非索引列更新不产生新索引项,减少写放大。
关键边界: 索引列变更或空间不足时无法 HOT。
错误选项辨析: HOT 是更新优化,与内存热数据、重建表、免日志无关。
116 死元组过多对查询性能的影响是?
难度: 进阶
- A. 查询自动跳过死元组,零影响
- B. 死元组让索引失效
- C. 死元组只影响写入
- D. 扫描更多页面与行版本,查询变慢并放大 I/O
查看答案与解析
正确答案D
正确原因: 顺序扫描仍要经过含死元组的页面,索引膨胀也拖慢查找。
关键边界: 需监控表膨胀并及时 VACUUM。
错误选项辨析: 死元组明显影响读路径,不破坏索引但使其膨胀。
117 表与索引出现明显膨胀(bloat)时,处理思路是?
难度: 实战
- A. 先定位膨胀来源,再 VACUUM 或 VACUUM FULL、REINDEX 治理
- B. 直接删除表重建
- C. 忽略并等待自动恢复
- D. 只增加内存即可
查看答案与解析
正确答案A
正确原因: 膨胀治理需区分表膨胀与索引膨胀,选择对应手段。
关键边界: 大表操作要评估锁与窗口,索引可用 CONCURRENTLY 重建。
错误选项辨析: 删表不可接受,膨胀不会自愈,内存不能替代空间回收。
118 高更新表 autovacuum 跟不上的常见调整是?
难度: 实战
- A. 关闭 autovacuum 提升性能
- B. 提高 autovacuum 触发频率或降低 scale factor 阈值
- C. 把表改成视图
- D. 删除统计信息
查看答案与解析
正确答案B
正确原因: 调整阈值与代价参数让清理更频繁,匹配高更新速率。
关键边界: 过度频繁会增加 I/O,需观察实际清理进度。
错误选项辨析: 关闭 autovacuum 会膨胀,改视图、删统计都是错误方向。
119 监控表级清理与扫描情况,应查看?
难度: 基础
- A. pg_roles
- B. information_schema.columns
- C. pg_stat_user_tables 等统计视图
- D. pg_settings 中的全部参数
查看答案与解析
正确答案C
正确原因: pg_stat_user_tables 提供扫描、死元组与 last_vacuum 等指标。
关键边界: 结合 pg_stat_activity 分析长事务与锁。
错误选项辨析: 角色、列元数据与配置参数不提供清理统计。
120 表膨胀会导致查询计划怎么变化?
难度: 进阶
- A. 计划完全不变
- B. 自动改为使用视图
- C. 优化器会删除膨胀表
- D. 估算页数与扫描成本上升,优化器可能放弃索引或增加扫描范围
查看答案与解析
正确答案D
正确原因: 膨胀改变表的大小与统计,成本估算随之变化,计划可能退化。
关键边界: VACUUM 与 ANALYZE 后计划通常会改善。
错误选项辨析: 计划会变化,不涉及视图与删除表。