GIN索引是否具有O(N ^ 2)复杂度的数组重叠运算符?

时间:2018-10-03 09:39:21

标签: sql postgresql indexing

在我的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

query performance

请帮助我了解是什么原因导致查询1的O(N ^ 2)性能,以及查询2是否是解决此问题的最佳方法。

谢谢 费利克斯·盖森德尔弗(FelixGeisendörfer)

PS:我正在使用Postgres 10,但还验证了Postgres 11存在此问题。

我也posted this question在postgres性能邮件列表中,但很遗憾没有得到任何答案。

0 个答案:

没有答案