主要观点:
- 定期检查 Postgres 实例热路径中的语句很重要,可通过
pg_stat_statements视图查看 SQL 语句统计信息,其中shared_blks_dirtied和shared_blks_written列可跟踪语句修改和写入磁盘的块数。 - Postgres 使用多版本并发控制(MVCC)允许多个客户端并发读写数据,会导致一些并发相关的现象,如非重复读等,客户端可根据需求选择不同的隔离级别。
- 表数据在磁盘上分为主叉、空闲空间映射(FSM)和可见性映射(VM)三种文件,逻辑上分为块(页),页中可存储一个或多个行版本(元组)。
- 简单的
SELECT查询可能会导致数据写入,原因是行更新时会添加新的行版本,更新事务的提示位不能及时更新,后续读取语句会设置提示位,导致写入,另外页面修剪(page pruning)过程也可能导致写入。 - Postgres 可使用堆只元组(HOT)优化来避免更新索引,但会导致查找最新可见行版本的链变长。
关键信息:
pg_stat_statements视图:用于查看 SQL 语句统计信息。- MVCC:多版本并发控制,允许多个客户端并发读写数据。
- 页布局:包括页头、行标识符和用户数据等部分。
- 行更新:更新时会添加新的行版本,保留未更改的数据。
- 提示位更新:读取处于模糊状态的行版本时会设置提示位,导致写入。
- 页面修剪:删除页面中过时的行版本,节省存储空间。
- HOT 更新:仅在堆中记录某些行更新,避免更新索引,但会导致查找最新版本的链变长。
重要细节:
- 表数据在磁盘上的文件结构及页的相关信息。
- 行标识符的结构及作用。
- 不同事务状态的标识及含义,如
t_xmin、t_xmax、t_infomask等。 - 页面修剪的触发条件及过程。
- HOT 更新的条件及对元组标识的影响。
- 示例中使用的 PostgreSQL 版本为 17,以及一些关于列类型使用的注意事项等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。