在我的GIN索引上使用&&数组运算符时遇到了一个问题。基本上我有一个看起来像这样的查询:
SELECT *
FROM example
WHERE keys && ARRAY[1,2,3,...]
这对于数组文字中的少量数组元素(N)来说效果很好,但是随着N看起来似乎复杂度为O(N ^ 2)变大,它会变慢。
但是,通过研究文档描述的GIN数据结构,看来其性能可能为O(N)。实际上,可以将查询计划器强制为这样的O(N)计划:
SELECT DISTINCT ON (example.id) *
FROM unnest(ARRAY[1,2,3,...]) key
JOIN example ON keys && ARRAY[key]
为了更好地说明这一点,我创建了一个jupyter笔记本,用于填充示例表,显示两个查询的查询计划,最重要的是对它们进行基准测试并绘制时间与数组大小(N)的关系图。
https://github.com/felixge/pg-slow-gin/blob/master/pg-slow-gin.ipynb
请帮助我了解是什么原因导致查询1的O(N ^ 2)性能,以及查询2是否是解决此问题的最佳方法。
谢谢 费利克斯·盖森德尔弗(FelixGeisendörfer)
PS:我正在使用Postgres 10,但还验证了Postgres 11存在此问题。
我也posted this question在postgres性能邮件列表中,但很遗憾没有得到任何答案。