[表orders
]总共包含1,500,000张小表。重新启动系统后,我运行以下查询:
SELECT pg_prewarm('orders');
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM orders WHERE o_totalprice < 100
哪个给出了如下缓冲区输出:
Buffers: shared hit=15768 read=10327
select语句不返回任何记录。
现在我的问题是,PostgreSQL如何计算将在缓冲区中占用15768个块?
运行pg_prewarm('orders')
时,它将把orders
表中的某些数据从磁盘拉到内存中。当您随后调用EXPLAIN ANALYZE
时,将运行查询,但不会返回任何记录,因为EXPLAIN
就是这么做的-它显示了查询执行路径的计划和统计信息。因为您还指出了BUFFERS
,所以它还返回有关它可以在缓存中找到多少数据以及需要从硬盘中提取多少其他数据的信息。
对于Buffers: shared hit
和read
,它告诉您在运行查询(SELECT * FROM orders WHERE o_totalprice < 100
)时,它已找到15768个相关块已缓存在内存中,然后需要从磁盘读取10327个以上的块。] >
可以在Shared hit cache in postgreSQL中找到更多信息