том, что у меня есть несколько млн записей с jsonb массивами страниц и мне надо их сравнить как множества. То есть 1,2,3 = 2,1,2,3 ; 1,2,3 != 1,2,3,4 ; 1,2 != 1,2,3.
Сейчас я делаю это как select (dataBefore -> 'pages' <@ dataAfter -> 'pages') and (dataBefore -> 'pages' @> dataAfter -> 'pages') from table1; И оно работает медленно. Хотелось бы ускорить этот процесс, но я не знаю как. Пока что додумался в начало вставить сравнение длины массивов - на 100к записей время уменьшилось с 380 до 290 секунд. Что еще можно сделать?
Вот пример моего запроса, который работает медленно на большом кол-ве данных. https://sqlize.online/s/T2
Для начала разговора о скорости запросов предоставьте информацыю из закрепа: https://t.me/pgsql/303899 Для этого можно воспользоваться вот этим скриптом: https://t.me/pgsql/476688 Без всей этой информацыи такой разговор будет беспредметным.
Попробуй сначала предварительно вычислить все dataBefore -> 'pages' и dataAfter -> 'pages‘ (в CTE или временной таблице), и потом сравнивать уже их Ещё в порядке эксперимента - попробовать преобразовать результат предвычислений к int[] и уже на него натравить <@. Возможно, что будет быстрее работать, чем сравнение json
Первым вариантом пользовались раньше и он был быстрее, но тратил слишком много памяти. Сейчас проблему решил уходом с postgres_fdw на dblink. С изначальным запросом в этот чат оно не связано, но работу ускорило. Спасибо!
Обсуждают сегодня