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