【发布时间】:2012-10-16 00:39:39
【问题描述】:
我在 postgresql 中有一个表,其中包含一个不断更新的数组。
在我的应用程序中,我需要获取该数组列中不存在特定参数的行数。我的查询如下所示:
select count(id)
from table
where not (ARRAY['parameter value'] <@ table.array_column)
但是当增加该查询的行数和执行量(每秒几次,可能数百或数千次)时,性能会下降很多,在我看来,postgresql 中的计数可能具有线性顺序执行(我不完全确定这一点)。
基本上我的问题是:
是否存在适用于这种情况的我不知道的现有模式?最好的方法是什么?
您能给我的任何建议将不胜感激。
【问题讨论】:
-
不确定,但我认为 table.array_column 上的 GIN 索引将有助于加快速度。您需要运行 EXPLAIN 才能找到答案。见这里:dba.stackexchange.com/a/27505/1822
-
随着表变大,很难在 postgres 中提高效率。杜松子酒索引仅在测试谓词中的“包含在”而不是“不包含在”时才有帮助。如果计数是否 100% 准确并不重要,您可以尝试使用一些 TTL 在应用层缓存它。如果你对表的写入率不是太高,你可以合理地使用触发器来更新另一个包含当前计数的表。
-
最好显示你的版本和
explain analyze;见stackoverflow.com/tags/postgresql-performance/info -
是否有固定的属性列表?您无法真正索引那里 not 的内容,因此您可以将其重新构建为条目 not 具有的参数列表。
-
我相信属性列表可能是固定的。如果这有助于以某种方式解决问题,当然可以假定它已修复。
标签: postgresql count database-performance postgresql-performance