SELECT * FROM <table>
SELECT <primary key fields> FROM <table> ORDER BY <primary key fields>
SELECT <indexed fields> FROM <table> ORDER BY <indexed fields>
# SELECT oid, datname FROM pg_database ;
oid | datname
-------+-----------
<...>
16384 | test
-- out of database is 16384
# SELECT oid, relname FROM pg_class WHERE relname like 'fn%';
oid | relname
-------+---------
24576 | fn
(1 row)
-- oid of our table is 24576
Postgres 9.4最终添加了一个扩展来将数据从关系预加载到操作系统或数据库缓冲区缓存中(由您选择):
pg_prewarm
在您的数据库中运行一次(此处有详细说明):
然后很容易预加载任何给定的关系。基本示例:
查找在搜索路径中命名的第一个表并将
my_tbl
其加载到 Postgres 缓冲区缓存。或者:
默认为
buffer
,影响最大(成本较高,效果最好)。阅读手册了解更多详情。
Depesz也写过博客。
您可能对其中一个邮件列表主题感兴趣,Tom Lane(核心开发人员)对此进行了回答:
您可能还对 SO 问题感兴趣:https : //stackoverflow.com/questions/486154/postgresql-temporary-tables 并且可能更适合https://stackoverflow.com/questions/407006/need-to-load-the -whole-postgresql-database-into-the-ram
在一般情况下,如果您有足够的 RAM,您通常可以相信数据库服务能够很好地将您经常使用的东西保存在 RAM 中。一些系统允许你提示表应该始终保存在 RAM 中(这对于不经常使用的小型表很有用,但是当它们被使用时,它们尽可能快地响应很重要)但是如果 pgsql 有这样的表提示您需要非常小心地使用它们,因为您正在减少可用于缓存其他任何内容的内存量,因此您可能会降低整个应用程序的速度。
如果您希望在启动时初始化数据库的页面缓存(例如,在重新启动或其他导致数据库忘记缓存的所有内容的维护操作之后),请编写执行以下操作的脚本:
(对每个索引或课程重复最后一步,并注意 ORDER BY 子句中的字段顺序正确)
在运行上述每个数据和索引页面后,应该已经被读取,因此将在 RAM 页面缓存中(至少暂时如此)。我们的应用程序数据库有这样的脚本,这些脚本在重新启动后运行,以便之后登录系统的第一批用户不会遇到较慢的响应速度。您最好手写任何这样的脚本,而不是扫描数据库定义表(如MSSQL 中的
sys.objects
//sys.indexes
)sys.columns
,然后您可以有选择地扫描最常用的索引,而不是扫描需要更长时间的所有内容。我遇到了类似的问题:
在重新启动服务器服务并且所有已兑现的数据都丢失后,许多查询在第一次调用时真的很慢,原因是查询的特定复杂性,直到所有必要的索引和数据都被兑现。这意味着,例如,用户必须点击每个“项目”(1-3 秒的执行时间)和来自 5000 万行的相关数据,这样用户就不会再遇到任何不必要的延迟。用户首先需要 3 个小时才能体验到令人讨厌的挂起,直到大多数使用的数据被兑现并且程序在生产性能方面处于一流水平,即使如此,2 天也有一些突然的短暂延迟,当第一次访问的数据减少时...... , 用于统计数据等。
为了解决这个问题,确实编写了一个小的 python 脚本,它确实对具有大索引的最常用的表执行选择。运行需要 15 分钟,并且没有性能延迟。
嗯,可能是 COPY 命令会有所帮助。只需执行 COPY 到标准输出并从中读取。可以使用 pg_dump 来做到这一点:
另一种方法是找到所有表文件并运行
cat <files> > /dev/null
.这是有关如何获取表文件名的示例:
所以,表的文件是 /path/to/pgsql/data/base/16384/24576*
您可能还想读取索引和 toast 表,以相同的方式获取它们的 oid。
顺便说一句,你为什么需要它?我相信 postgresql 和操作系统足够聪明,可以缓存最热的数据并保持良好状态。缓存效率。
我使用来自QSoft的RamDrive,它被评为 Windows 上最快的 ramdisk。我刚用
initdb -D e:\data
其中 e:\ 是 RamDisk 的位置。