【问题标题】:Postgres: Materialized Views query taking longer to executePostgres:物化视图查询执行时间更长
【发布时间】:2019-09-15 08:06:37
【问题描述】:

我是使用 Postgres 的新手,我有一个关于物化视图的问题。我目前正在使用 Postgres 9.6.0 和 PGAdmin 4。

我有一个由多个连接组成的查询,当它在 PGAdmin 中执行时,大约需要 13 秒。考虑到设置了正确的索引,这是真的。

下一种方法是使用物化视图。通过使用物化视图并设置适当的索引,我假设运行查询会快得多,因为数据将被缓存/临时存储。 但是运行查询后,看起来仍然需要 13 秒.....

除非我对物化视图的理解不正确,否则有人可以解释为什么执行物化视图会花费与运行查询一样长的时间。可能是 PGAdmin 导致了这个问题吗?或者 Postgres 中是否有需要设置的设置,以便数据在物化视图中持久化?

感谢任何建议。谢谢。

【问题讨论】:

  • 您确定创建的是物化视图 (CREATE MATERIALIZED VIEW...) 而不仅仅是常规视图 (CREATE VIEW...)?刷新物化视图大约需要 13 秒,但刷新后,选择应该更快。
  • 您确实更改了查询以使用 MView,对吗?如果有一个碰巧有相同查询的 mview,Postgres(与 Oracle 不同)不会神奇地重写查询。
  • 嗨@Jeremy,是的,我确实使用了 CREATE MATERIALIZED VIEW mv_view AS 语句。有趣的是,针对这个视图运行 SQL 语句并没有帮助
  • 如果查询很慢,请总是至少包括查询本身和EXPLAIN (ANALYZE, BUFFERS) <query> 的输出。

标签: postgresql postgresql-9.6 materialized-views


【解决方案1】:

这是简单案例的预期行为。这意味着物化视图是对索引进行查询的结果,其性能与派生它的索引完全相同。如果您考虑一下,这很有意义。

物化视图不一定比首次访问的底层查询具有更好的性能。数据组装的复杂性可能是微不足道的。与一组复杂的标准或需要功能处理或排序的东西相比,许多使用索引的连接的密集程度要低得多。

您在本例中发现,底层查询与同一数据集的物化视图一样好。对于这种情况,您可能需要考虑一个简单的视图。

【讨论】:

  • 有趣。鉴于物化视图的结果会被缓存,我不完全理解......因此检索不应该更快吗?
  • 物化视图由表支持。您甚至可以针对它们创建索引。在第一次访问之后,结果可能也在 shared_buffers 中。在某些情况下,这也有助于访问,但不能保证它会被缓存。
  • 好的,所以只是为了确认一下,结果并不总是被缓存?因为那不是物化视图。只将查询结果存储到一张表中,查询只在该一张表上执行会更好吗?
  • 你们俩都搞错了,@KirkRoybal 在不了解原始查询、视图或数据的情况下假设太多。这只是疯狂的猜测,对不起。使用物化视图时,访问它可能比创建它的查询慢,但这需要根据 OP 提供的实际数据进行验证。
  • 我回答了简单案例的问题,没有做任何假设,并且说得很明确。 @ancoron 你的批评是没有道理的。我会挑战你解释“你们俩都做错了”,这正是你指责别人做出的假设。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
相关资源
最近更新 更多