Индекс GIN имеет сложность O (N ^ 2) для оператора перекрытия массива? - PullRequest
0 голосов
/ 03 октября 2018

Я столкнулся с проблемой при использовании оператора массива && для моего индекса 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

Пожалуйста, помогите мне понять, что вызывает производительность O (N ^ 2) для запроса 1, и если запрос 2 - лучший способ обойти эту проблему.

Спасибо Феликс Гейзендёрфер

PS: Я использую Postgres 10, но также проверил, что эта проблема существует с Postgres 11.

Я также разместил этот вопрос в списке рассылки производительности postgres, но, к сожалению, не сделалОтвета нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...