PgFincorePostgreSQL 内存页管理函数
PgFincore 包含一组用于管理 PostgreSQL 内存中页面的函数。
使用PostgreSQL,每个表或索引通常都分成1GB的段,并且每个段都分为内存中的页面和文件系统的块。
这些功能使您可以知道某个关系中的哪个磁盘块以及多少磁盘块在操作系统的页面缓存中。它可以将结果提供为VarBit,并可以存储在表中。然后,使用此表,由于流复制,甚至在其他服务器中,也可以为该关系的每个块恢复页面缓存状态。
其他功能用于在整个关系(每个段)上设置POSIX_FADVISE标志。比较有用的可能是WILLNEED和DONTNEED,它们分别从页面缓存中推入和弹出关系的每个段。
至少使用表名或索引名(或oid)作为参数调用每个函数,并遍历关系的每个段。
安装
从源代码:
make clean
make
su
make install
对于PostgreSQL> = 9.1,登录数据库并:
mydb=# CREATE EXTENSION pgfincore;
对于其他发行版,请从sql脚本创建函数(它应该在contrib目录中):
psql mydb -f pgfincore.sql
PgFincore还随附Debian脚本来构建您自己的软件包:
aptitude install debhelper postgresql-server-dev-all postgresql-server-dev-9.1
# or postgresql-server-dev-8.4|postgresql-server-dev-9.0
make deb
dpkg -i ../postgresql-9.1-pgfincore_1.1.1-1_amd64.deb
PgFincore 在http://yum.postgresql.org/上用于RPM打包 。PgFincore 在http://pgapt.debian.net/上用于debian打包。
以下是一些用法示例。如果您想了解更多详细信息,请访问Documentation_
获取关系的当前状态
可能有用:
cedric=# select * from pgfincore('pgbench_accounts');
relpath | segment | os_page_size | rel_os_pages | pages_mem | group_mem | os_pages_free | databit | pages_dirty | group_dirty
--------------------+---------+--------------+--------------+-----------+-----------+---------------+---------+-------------+-------------
base/11874/16447 | 0 | 4096 | 262144 | 262144 | 1 | 81016 | | 0 | 0
base/11874/16447.1 | 1 | 4096 | 65726 | 65726 | 1 | 81016 | | 0 | 0
(2 rows)
Time: 31.563 ms
在OS页面缓冲区中加载表或索引
您可能希望尝试在OS页面缓存中保留一个表或索引,或者在执行众所周知的大查询之前减少表的装载时间(减少查询时间)。
为此,只需执行以下查询:
cedric=# select * from pgfadvise_willneed('pgbench_accounts');
relpath | os_page_size | rel_os_pages | os_pages_free
--------------------+--------------+--------------+---------------
base/11874/16447 | 4096 | 262144 | 169138
base/11874/16447.1 | 4096 | 65726 | 103352
(2 rows)
Time: 4462,936 ms
- 列os_page_size报告页面大小为4KB。
- rel_os_pages列是指定文件的页数。
- 列os_pages_free是内存(用于缓存)中的可用页数。
快照和还原表或索引(或更多)的OS页缓冲区状态
您可能希望像执行快照一样将表或索引还原到OS页面缓存中。例如,如果您必须重新引导服务器,则PostgreSQL启动时,第一个查询可能会变慢,因为PostgreSQL或OS都没有在各自的缓存中包含有关这些第一个查询所涉及的关系的页面。
执行快照和还原非常简单:
-- Snapshot
cedric=# create table pgfincore_snapshot as
cedric-# select 'pgbench_accounts'::text as relname,*,now() as date_snapshot
cedric-# from pgfincore('pgbench_accounts',true);
-- Restore
cedric=# select * from pgfadvise_loader('pgbench_accounts', 0, true, true,
(select databit from pgfincore_snapshot
where relname='pgbench_accounts' and segment = 0));
relpath | os_page_size | os_pages_free | pages_loaded | pages_unloaded
------------------+--------------+---------------+--------------+----------------
base/11874/16447 | 4096 | 80867 | 262144 | 0
(1 row)
Time: 35.349 ms
- pages_loaded列报告已将多少页读取到内存中(它们可能已经存储在备忘录中)
- pages_unloaded列报告从内存中删除了多少页(它们可能尚未存储在备忘录中);