Я столкнулся с проблемой при использовании оператора массива && для моего индекса 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](https://i.stack.imgur.com/AcQm5.png)
Пожалуйста, помогите мне понять, что вызывает производительность O (N ^ 2) для запроса 1, и если запрос 2 - лучший способ обойти эту проблему.
Спасибо Феликс Гейзендёрфер
PS: Я использую Postgres 10, но также проверил, что эта проблема существует с Postgres 11.
Я также разместил этот вопрос в списке рассылки производительности postgres, но, к сожалению, не сделалОтвета нет.