【问题标题】:PostgreSQL efficiency of count query, materialized views [duplicate]计数查询,物化视图的PostgreSQL效率[重复]
【发布时间】:2012-10-16 00:43:39
【问题描述】:

可能重复:
Optimization of count query for PostgreSQL

使用 PostgreSQL 9.2,我们试图弄清楚是否有一种方法可以跟踪查询的结果数量,并以有效的方式返回该数字。这个查询应该每秒执行几次(可能几十到几百甚至几千次)。我们现在的查询看起来像这样,但我们想知道这是否效率低:

-- Get # of rows that do not have ‘parameter value’ in array_column
select count(*) 
    from table
    where not (ARRAY[‘parameter value’] <@ table.array_column)

我的问题是(一个答案可能同时解决多个问题):

该查询的count(id)(或count(*))是线性(O(n)) 查询吗?

有什么方法可以让这个查询在 PostgreSQL 中更高效吗?请记住,我们需要查询不同的参数值,因此我认为为其保留物化视图是不可行的(尽管如果认为这样更好,我们可能会考虑为每个参数值创建一个)。

我应该对查询、数据库结构或我的 PostgreSQL 服务器的配置进行任何更改以帮助我提高查询性能吗?

任何指针或建议将不胜感激。如果这是完全错误的方法,请告诉我。

编辑

考虑到答案,我想知道使用物化视图是否合理。我的意思是有几个物化视图(每个视图都有一个不同的参数值,具有不存在该值的行)。我们的参数值在一定程度上是可预测的,因此作为解决方案似乎并不太远。这带来了另一个问题:物化视图在这里会有所帮助吗?我可以在数据库中创建的物化视图(或表)的数量是否存在一些限制(定义或性能)?

【问题讨论】:

  • 不确定,但我认为table.array_column 上的 GIN 索引将有助于加快速度。您需要运行 EXPLAIN 才能找到答案。见这里:dba.stackexchange.com/a/27505/1822 我认为你不需要从你的参数值创建一个数组(如果那确实只是一个值)
  • 这似乎和stackoverflow.com/q/13075210/398670 一样……为什么?这是某处提出的任务吗?

标签: arrays postgresql count materialized-views


【解决方案1】:

想到的第一个想法是缓存值。

您应该评估此值的变化率,并根据此决定是否要在更新此表时执行触发器以计算新值并将其缓存在某处。

对该值的查询结果将是一个没有任何 WHERE 子句的简单 SELECT,因此速度非常快。

或者您可以简单地进行更改,并在之前和之后获取一些统计数据,以了解您是否加快了速度。

更多解释请参见there

【讨论】:

  • 好吧,这听起来可能可行,但是......当你说“某处”时,你是什么意思?如果您指的是数据库,我不明白如何在没有位置的情况下缓存不同参数值的结果。另一方面,将其缓存在 Redis 之类的地方可能会更简单、更容易。
  • 您可以创建一个专用表来保存该值。触发器只会更新值。或者您可以将值转储到文件中,然后从您的应用中读取内容,但您可能会遇到同步问题。
猜你喜欢
  • 2022-06-16
  • 2012-11-01
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 2015-07-20
  • 2011-05-15
  • 1970-01-01
相关资源
最近更新 更多