postgresql - 如何禁用 postgresql "Cache"优化?

标签 postgresql

我正在尝试优化我的功能。
问题是一旦你得到一个结果就运行查询。
第二次或第三次运行查询,处理时间要短得多。

SELECT  map.get_near_link(a.X, a.Y, a.azimuth)
FROM traffic.avl;

第一次17段

Total query runtime: 17188 ms.
801 rows retrieved.

第二次11段

Total query runtime: 11406 ms.
801 rows retrieved.

我猜有某种缓存在幕后进行优化。 我怎样才能禁用此行为,以便获得更真实的运行时值?

最佳答案

在查询结果缓存的意义上,PostgreSQL 没有“缓存”优化。

它会缓存最近在 shared_buffers 中读取的表 block ,但对于大多数安装来说效果很小。主缓存是操作系统的磁盘读取缓存。有关详细信息,请参阅:

See and clear Postgres caches/buffers?

在我看来,您的系统似乎具有合理数量的 RAM 和快速的 CPU,但磁盘速度非常慢。因此,仅命中操作系统磁盘缓存的查询速度非常快,但进入磁盘的查询需要几秒钟才能读入数据。因此缓存效果非常强。

你应该explain (buffers, analyze, verbose) SELECT ... 你的查询。尝试使用几个不同的输入值,直到你得到一个缓慢的输入值。比较计划。

如果计划相同,可能就是这样。

如果计划不同,您可能会遇到查询计划器根据表统计信息的变化做出错误选择的情况。增加感兴趣的列的统计目标可能会有所帮助(请参阅手册)。如果您有不同的计划并且遇到困难/需要帮助,请随时在 dba.stackexchange.com 上发布一个新问题并提供详细信息。

关于postgresql - 如何禁用 postgresql "Cache"优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24252455/

相关文章:

postgresql - 如果时间部分是可选的,如何将日期时间存储在数据库中?

sql - 在没有 HAVING 子句的情况下如何改进此查询

sql - 从表中的同一列获取日期为 'from date' 和 'to date'

ruby-on-rails - PostgreSQL 是否支持 Rails 的精度和规模?

python - 如何使用 Python 测试 timescaledb 数据库

postgresql - 将连接查询从数据库复制到另一个数据表

Postgresql 不适用于 ubuntu 16.04

python - Django 'Key(field)=() is duplicated'

sql - 从表中选择一组动态列并获取每个列的总和

sql - postgresql 中的慢 OR 语句