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页面缓存中保留一个表或索引,或者在执行众所周知的大查询之前减少表的装载时间(减少查询时间)。
为此,只需执行以下查询:
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页面缓存中。例如,如果您必须重新引导服务器,则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