使用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服务器的配置做些什么改变,这可能有助于我提高查询性能?
任何指针或建议都将不胜感激。如果这是一个完全错误的方法,请告诉我。非常感谢!
修改
考虑到回答的问题,我想知道使用物化视图是否合理。我的意思是有几个物化视图(每个视图都有不同的参数值,其中的行不存在该值)。我们的参数值在某种程度上是可预测的,所以这似乎并不是一个解决方案。这带来了另一个问题:物化观点在这方面有帮助吗?对于我可以在数据库中创建的物化视图(或表)的数量,是否存在某些限制(无论是定义还是性能)?
非常感谢你的帮助!
答案 0 :(得分:1)
首先想到的是缓存价值。
您应该评估此值的更改率,并根据该值确定是否要在更新此表时计算新值并将其缓存到某个位置时执行触发器。
对该值的结果查询将是一个没有任何WHERE子句的简单SELECT,使其非常快。
或者您可以简单地进行更改,并在之前和之后获取一些统计数据,以了解您是否已经获得了速度。
有关详细说明,请参阅there。