-- 查询表所在磁盘的位置
select pg_relation_filepath('表名')
-- out
base/16393/24804
包含三个文件, 具体介绍请看PostgreSQL目录结构之base目录,Free Space Map and Visibility Map:
24804代表表的OID(object id)
注意: 因为一个页是8K,如果一个表的列中可能存储相当大的项,那么该表就会有个与之相关联的TOAST表, 它用于存储无法保留在在表行中的域值的线外存储。 参考68.2. TOAST。
每个表每8K
分一页,行数据存在页中
-- 查询表页数、行数
SELECT relpages as 页个数, reltuples as 行个数 FROM pg_class WHERE relname = '表名'
-- 查询占空间大小(排名前20)
SELECT table_schema || '.' || table_name AS table_full_name,
pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS size
FROM information_schema.tables
ORDER BY pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC
limit 20;
表中的一个页面包含如下描述的三种数据:
索引
。在表中的页面中,它指向页面的末尾。(在索引内的页面中,它指向特殊空间的开头,即只有索引持有的数据区域,根据索引类型的种类,如B-tree、GiST、GiN等包含特定的数据。)左侧为顺序扫描,右侧为b-tree索引扫描
b-tree扫描细节
我们知道,大多数OLTP工作负载是随机的I/O,但是从磁盘获取非常缓慢。为了克服这个问题,和其它现有的数据库系统差不多,Postgres也把数据缓存到RAM(也就是我们说的内存)以提高性能。
shared_buffers所代表的内存区域可以看成是一个以8KB的block为单位的数组,即最小的分配单位是8KB。这正好是一个page的大小,每个page以page内部的元数据(Page Header)互相区分。 这样,当Postgres想要从disk获取(主要是table和index)数据(page)时,他会(根据page的元数据)先搜索shared_buffers,确认该page是否在shared_buffers中,如果存在,则直接命中,返回缓存的数据以避免I/O。 如果不存在,Postgres才会通过I/O访问disk获取数据(显然要比从shared_buffers中获取慢得多)。
以页为单位,cache满的时候,会淘汰不常用的页。淘汰后的数据则进行刷盘,但是一般数据都是通过WAL+Checkpointer保证修改的数据刷盘,而不用等到cache满了才进行刷盘。
使用explain时,Shared read
表示来自disk,Shared hit
则是已经在cache中
图形化分析也有展示
image.png
SELECT
c.relname,
pg_size_pretty(count(*) * 8192) as buffered,
round(100.0 * count(*) / (SELECT setting FROM pg_settings WHERE name='shared_buffers')::integer, 1) AS buffer_percent,
round(100.0 * count(*) * 8192 / pg_table_size(c.oid), 1) AS percent_of_relation
FROM pg_class c
INNER JOIN pg_buffercache b ON b.relfilenode = c.relfilenode
INNER JOIN pg_database d ON (b.reldatabase = d.oid AND d.datname = current_database())
GROUP BY c.oid, c.relname
ORDER BY 3 DESC
LIMIT 10;
参考: PostgreSQL查询shared buffer使用情况和清理方式
写操作先写WAL日志,写成功之后再写内存数据,之后Checkpointer进行数据刷盘,缓存数据即为最新数据。
参考: PostgreSQL-缓存利器
将重点数据、实时性要求高的数据
手动加载至数据库缓存中,减少重点数据的内存淘汰,不稳定IO。同时要考虑刷盘问题,宕机容灾问题。
这同时会牺牲其余不重点功能的性能,需要实际去压测。
计算服务-写主 报表读服务-读从
排除干扰,或者带上缓存综合去考虑优化方案。
1、PREPARE预加载,PostgreSQL手册-prepare 2、PostgreSQL 列存索引 - 新方式 - 列存 3、介绍PostgreSQL CTE(common table expressions) - with as 简化
1、深入理解Postgres中的cache 2、PostgreSQL物理存储简介 3、PostgreSQL Internals Through Pictures 4、The Internals of PostgreSQL
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有