【问题标题】:How disable postgresql "Cache" optimization?如何禁用 postgresql“缓存”优化?
【发布时间】:2014-08-06 19:05:28
【问题描述】:

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

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.

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

【问题讨论】:

  • 我想你可以假设第二个结果比第一个更现实。
  • 理论上我假设 x, y , 方位角在每个查询中都会不同,因为与第二个用户输入的确切值非常不同。所以我认为第一个值是最现实的。无论如何,如果我更改函数中的代码,我将不得不多次运行所有测试以确保其中一个是平均值。
  • 当我对 Postgres 进行非平凡测试时,我了解到第一个结果的标准差几乎总是最大的。因此我接受了跳过第一个结果的原则。我认为您必须使用随机参数测试您的函数。
  • 为您提供更多信息。在我的引擎中,我创建了一个字段 [tProcess] 来了解每个函数调用需要多少时间。通常每个函数调用少于 10 毫秒是正常的,但也有调用寄存器 2900 毫秒(x290 次)的情况。然后我想单独尝试这个案例,看看有什么问题,我得到执行时间是 30 毫秒:/
  • 这就是为什么你不能只依赖一个测试。唯一的方法是增加对随机值的测试次数。我还没有听说过将服务器重置到以前的状态的方法。

标签: postgresql


【解决方案1】:

就查询结果缓存而言,PostgreSQL 没有“缓存”优化。

它确实缓存了最近在shared_buffers 中读取的表块,但对于大多数安装来说,效果很小。主缓存是操作系统的磁盘读取缓存。欲了解更多信息,请参阅:

See and clear Postgres caches/buffers?

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

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

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

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

【讨论】:

  • 阅读您的回答后,我做了一些思考,看起来我的问题是因为磁盘速度慢。我不必尝试随机值,该函数已被调用 500 次/分钟,并且我记录了每个函数的处理时间。我的主要想法是尝试复制 function(x,y,z) 调用超过 2000 毫秒的情况,而通常只需要 30 毫秒。但是在查看日志文件并检查每种情况下的explain 之后,我总是得到相同的结果,并且永远无法复制缓慢的行为。所以我想在这些情况下,延迟更像是由于磁盘繁忙而不是索引错误造成的。谢谢。
【解决方案2】:
sync; sudo service postgresql stop; echo 1 > /proc/sys/vm/drop_caches; sudo service postgresql start

【讨论】:

  • 嗯,您可能希望避免在生产服务器上这样做...
【解决方案3】:

既然你说你想优化你的功能,而不是你的磁盘布局,那么第二个时间可能是你想要关注的那个目的,因为它们是你函数本身运行时间的最纯粹的度量,而不是收集数据以输入您的功能所需的时间。

由于第二次执行时间仍然是第一次执行时间的 2/3,即使您想优化总执行时间,这仍然是您关注的重点。

如果您确实需要这样做,您可以按照另一个答案中的说明清除缓存,但这通常太繁重而无法用于日常工作。更好的是创建一个程序/脚本来选择 a.X、a.Y、a.azimuth 的随机(但通常是现实的)值并使用它们运行查询。通过每次从一组现实示例中更改值,您可以获得最能代表现实世界的结果。制作这样的驱动程序需要更多的前期工作,但通常会有回报。

【讨论】:

  • 我遇到了同样的问题,即使我想优化我的功能,我也无法更改我的磁盘布局,所以我需要在最坏的条件下测试我的功能。那就是:当缓存中没有数据时,因为我可以更改查询的顺序和其他试图避免最坏情况的东西。但我需要能够对其进行多次测试。
猜你喜欢
  • 1970-01-01
  • 2012-08-24
  • 2019-06-19
  • 2014-08-04
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 2011-08-18
  • 2021-05-22
相关资源
最近更新 更多