【问题标题】:SQL_NO_CACHE for Postgresql?用于 Postgresql 的 SQL_NO_CACHE?
【发布时间】:2011-05-26 18:58:49
【问题描述】:

是否有 MySQL 关键字 SQL_NO_CACHE(或 SQL Server dbcc drop clean buffers)的等效 postgresql,即您可以简单地将其包含在 SQL 语句中或作为脚本的一部分?

更新:这个问题

See and clear Postgres caches/buffers?

似乎说答案是“不”,尽管它现在已经两年了。 postgresql 9.0 有什么相关的变化吗?

【问题讨论】:

  • 操作系统的磁盘缓存实际上可能比任何 postgres 缓存都与此有关。另请注意,您链接的问题的答案来自著名的 postgres 顾问/作者/博主/贡献者 Greg Smith,截至今年,他对答案发表了评论。如果有人知道这个问题的正确答案,那就是他,他说“没有办法绕过或刷新数据库的缓存。清除它的唯一办法就是重新启动服务器。”
  • @Frank 如果 postgres 使用直接 IO(如 InnoDB 那样),则使用它自己的缓存而不是操作系统缓存。大多数数据库似乎都使用 Direct IO。
  • Postgresql 不使用 Direct IO,只使用标准的读/写调用。

标签: mysql postgresql


【解决方案1】:

你所说的两件事根本不等价。

MySQL 的 SQL_NO_CACHE 不会阻止引擎使用缓存数据。这意味着查询没有缓存在 MySQL 查询缓存中

查询缓存与引擎可能拥有的任何磁盘缓存不同,因为它缓存查询结果,而不是磁盘中的块(或表中的行等)。所以它会缓存文本语句的结果。

使用 SQL_NO_CACHE 的原因是您知道您将执行一个不经常使用的查询,该查询会返回大量数据(因此会占用缓存中的大量空间)。

但现在建议大多数 MySQL 安装关闭查询缓存,以便为页面缓存等腾出更多内存(请参阅http://dom.as/tech/query-cache-tuner/

【讨论】:

  • 感谢您消除我的一些误解。我真正想做的是分析优化器做出的一些决定,并希望排除任何可能的“捷径”,例如,确保创建临时表的开销不会被 dint它已经“在那里”了。
【解决方案2】:

不需要,PostgreSQL 中的缓存工作方式非常不同,并且 100% 可靠。

【讨论】:

  • 我正在做一些基准测试,并试图避免命中缓存结果。
  • @davek:在这种情况下,您需要查看discard 命令。但您的基准将无效。
  • @davek:基准测试应该在尽可能现实的场景中进行。在不现实的情况下打开缓存,这意味着在关闭缓存的情况下获得的任何结果都只是在现实世界中没有意义的数字。
  • @Eelke:我同意你的观点,尽管在这种情况下我不是对代表性数据负载进行基准测试,而是对我想要分析其查询计划的离散查询进行基准测试。我只是想确保我没有遗漏任何开销。
  • @davek,缓存状态不会改变查询计划的结果,如EXPLAIN 所示。但是,来自EXPLAIN ANALYZE 的时间信息可能显示缓存数据的时间更快,但这应该是差异的程度。在您的情况下,我不知道您需要担心刷新缓存(尤其是因为您不太担心在迭代之间重新启动操作系统以清除操作系统的缓存)。
猜你喜欢
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 2012-01-27
  • 2020-02-23
  • 1970-01-01
  • 2010-12-19
相关资源
最近更新 更多