AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 2041
Accepted
Adam Matan
Adam Matan
Asked: 2011-04-04 04:50:43 +0800 CST2011-04-04 04:50:43 +0800 CST 2011-04-04 04:50:43 +0800 CST

PostgreSQL:强制数据进入内存

  • 772

是否有一种系统的方法来强制 PostgreSQL 将特定表加载到内存中,或者至少从磁盘读取它以便系统缓存它?

postgresql memory
  • 6 6 个回答
  • 50351 Views

6 个回答

  • Voted
  1. Erwin Brandstetter
    2015-09-30T15:11:25+08:002015-09-30T15:11:25+08:00

    Postgres 9.4最终添加了一个扩展来将数据从关系预加载到操作系统或数据库缓冲区缓存中(由您选择):

    pg_prewarm

    这允许更快地达到完整的操作性能。

    在您的数据库中运行一次(此处有详细说明):

    CREATE EXTENSION pg_prewarm;
    

    然后很容易预加载任何给定的关系。基本示例:

    SELECT pg_prewarm('my_tbl');
    

    查找在搜索路径中命名的第一个表并将my_tbl其加载到 Postgres 缓冲区缓存。

    或者:

    SELECT pg_prewarm('my_schema.my_tbl', 'prefetch');
    

    prefetch如果支持,则向操作系统发出异步预取请求,否则抛出错误。read 读取请求的块范围;与 不同prefetch的是,这是同步的,并且在所有平台和版本上都受支持,但可能会更慢。buffer将请求的块范围读入数据库缓冲区缓存。

    默认为buffer,影响最大(成本较高,效果最好)。

    阅读手册了解更多详情。
    Depesz也写过博客。

    • 46
  2. Best Answer
    DrColossos
    2011-04-04T06:58:56+08:002011-04-04T06:58:56+08:00

    您可能对其中一个邮件列表主题感兴趣,Tom Lane(核心开发人员)对此进行了回答:

    [..] 但我认为那些认为自己比 LRU 缓存算法更聪明的人通常是错误的。如果该表被大量使用,它将很好地保留在内存中。如果根据 LRU 算法,它没有足够多地用于留在内存中,那么内存空间可能真的应该花在其他东西上。[..]

    您可能还对 SO 问题感兴趣:https : //stackoverflow.com/questions/486154/postgresql-temporary-tables 并且可能更适合https://stackoverflow.com/questions/407006/need-to-load-the -whole-postgresql-database-into-the-ram

    • 34
  3. David Spillett
    2011-04-05T03:29:18+08:002011-04-05T03:29:18+08:00

    在一般情况下,如果您有足够的 RAM,您通常可以相信数据库服务能够很好地将您经常使用的东西保存在 RAM 中。一些系统允许你提示表应该始终保存在 RAM 中(这对于不经常使用的小型表很有用,但是当它们被使用时,它们尽可能快地响应很重要)但是如果 pgsql 有这样的表提示您需要非常小心地使用它们,因为您正在减少可用于缓存其他任何内容的内存量,因此您可能会降低整个应用程序的速度。

    如果您希望在启动时初始化数据库的页面缓存(例如,在重新启动或其他导致数据库忘记缓存的所有内容的维护操作之后),请编写执行以下操作的脚本:

    SELECT * FROM <table>
    SELECT <primary key fields> FROM <table> ORDER BY <primary key fields>
    SELECT <indexed fields> FROM <table> ORDER BY <indexed fields>
    

    (对每个索引或课程重复最后一步,并注意 ORDER BY 子句中的字段顺序正确)

    在运行上述每个数据和索引页面后,应该已经被读取,因此将在 RAM 页面缓存中(至少暂时如此)。我们的应用程序数据库有这样的脚本,这些脚本在重新启动后运行,以便之后登录系统的第一批用户不会遇到较慢的响应速度。您最好手写任何这样的脚本,而不是扫描数据库定义表(如MSSQL 中的sys.objects// sys.indexes)sys.columns,然后您可以有选择地扫描最常用的索引,而不是扫描需要更长时间的所有内容。

    • 5
  4. LongBeard_Boldy
    2013-03-08T03:38:52+08:002013-03-08T03:38:52+08:00

    我遇到了类似的问题:
    在重新启动服务器服务并且所有已兑现的数据都丢失后,许多查询在第一次调用时真的很慢,原因是查询的特定复杂性,直到所有必要的索引和数据都被兑现。这意味着,例如,用户必须点击每个“项目”(1-3 秒的执行时间)和来自 5000 万行的相关数据,这样用户就不会再遇到任何不必要的延迟。用户首先需要 3 个小时才能体验到令人讨厌的挂起,直到大多数使用的数据被兑现并且程序在生产性能方面处于一流水平,即使如此,2 天也有一些突然的短暂延迟,当第一次访问的数据减少时...... , 用于统计数据等。

    为了解决这个问题,确实编写了一个小的 python 脚本,它确实对具有大索引的最常用的表执行选择。运行需要 15 分钟,并且没有性能延迟。

    • 1
  5. rvs
    2011-04-04T06:12:55+08:002011-04-04T06:12:55+08:00

    嗯,可能是 COPY 命令会有所帮助。只需执行 COPY 到标准输出并从中读取。可以使用 pg_dump 来做到这一点:

    pg_dump -U <user> -t <table> <database> > /dev/null
    

    另一种方法是找到所有表文件并运行cat <files> > /dev/null.

    这是有关如何获取表文件名的示例:

    # 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
    

    所以,表的文件是 /path/to/pgsql/data/base/16384/24576*

    您可能还想读取索引和 toast 表,以相同的方式获取它们的 oid。

    顺便说一句,你为什么需要它?我相信 postgresql 和操作系统足够聪明,可以缓存最热的数据并保持良好状态。缓存效率。

    • 0
  6. David
    2011-04-05T14:48:23+08:002011-04-05T14:48:23+08:00

    我使用来自QSoft的RamDrive,它被评为 Windows 上最快的 ramdisk。我刚用

    initdb -D e:\data

    其中 e:\ 是 RamDisk 的位置。

    • 0

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve