【问题标题】:How can i check in Postgresql if specific index is loaded to memory?如果将特定索引加载到内存中,我如何检查 Postgresql?
【发布时间】:2011-02-09 14:09:56
【问题描述】:

有什么方法可以检查索引是否加载到内存中?

【问题讨论】:

    标签: postgresql indexing


    【解决方案1】:

    请注意,PostgreSQL 不能仅根据索引数据执行查询。它必须访问数据以确定从查询的角度来看哪些信息是可见的;该信息仅在行本身中,而不在索引中。很可能索引都在 RAM 中,但您仍然会看到大量 I/O,因为表不适合那里。

    【讨论】:

      【解决方案2】:

      查看贡献模块pg_buffercache

      安装后你可以使用这个查询来查看表和索引是否在buffercache中:

      SELECT
          DISTINCT
          relname
      FROM
          pg_buffercache
              JOIN pg_class USING (relfilenode)
      WHERE
          relname IN('your_tablename','your_index_name'); 
      

      【讨论】:

      • 我检查了这个,但没有帮助。数据库可以使用索引,但每次都从硬盘而不是内存中读取。
      • 向我们展示您的相关数据模型、查询和 EXPLAIN ANALYZE 的结果。如果没有这些信息,就无法为您提供帮助。
      • 为什么这很重要?我知道查询正在使用的索引的名称,并通过 EXPLAIN ANALYZE 检查 postgresql 是否实际使用它,我只想检查它在扫描此索引时是否每次都从硬盘读取它
      • 啊,我的错。您是否 200% 确定完整索引已在内存中时从磁盘读取?这会很奇怪,这会使内存变得无用。事实并非如此。您是否也检查了索引的页码(relblocknumber)?
      • 当我运行查询时,由于 IO 负载高,我确定它正在从硬盘读取。 shared_buffers 的设置是 2GB,effective_cache_size 也是 2GB,索引只有 350MB,所以应该适合内存。我不明白为什么 Postgres 一直从硬盘读取..
      【解决方案3】:

      为此使用PgFincore

      请注意,这个问题确实有一个两步解决方案,因为 PostgreSQL 具有两级缓存机制。 pg_buffercache 是检查 PostgreSQL 共享缓冲区缓存的正确工具。 pgfincore 是检查操作系统缓存的正确工具。

      【讨论】:

      • select * from pgfincore('tablename');返回 >>ERROR: fincore(91, 0, 1073741824, 0x22a83a0): Invalid argument
      猜你喜欢
      • 2017-07-19
      • 2011-05-16
      • 2012-03-31
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 2018-02-03
      相关资源
      最近更新 更多