Как оптимизировать большой список NOT IN postgres в JPA
У меня есть JpaRepository. Есть некая сущность Test и бд на postgres в которой больше 10 млн записей. Мне необходимо обработать все эти записи поочередно. Для этого есть таблица с id уже обработанных Test.
Я хотел бы получать лист id необработанных Test, для этого, в репозитории я пишу что то такое:
@Query("select t.id from Test t " +
"where t.var is not null " +
"and ..." +
"and t.id not in :ids")
Page<Integer> findAllNotGeneratedId(@Param("ids") List<Integer> ids, Pageable pageable);
Все работает, но из-за особенностей обработки IN в postgres, он работает очень медленно. Я прочитал, что можно оптимизировать данный запрос используя вместо "NOT IN" LEFT OUTER JOIN(VALUES ...) ну и поставив условие. Я пытался записать это в свой @Query, но он выдает синтаксическую ошибку. В документации JPA не нашел никакой информации по этому поводу.
Как можно реализовать такое? Скажу сразу, что сджойнить исходные таблицы нельзя(свои особенности). Может быть я вообще думаю не в том ключе? Буду рад любой помощи.
Ответы (1 шт):
тут явно должен быть индекс на поле таблицы, которое определяет "обработанность" записи. если распределение обработанных-необработанных отличается от 50/50, а точнее много обработанных/очень мало не обработанных, то можно даже частичный индекс с условием на необработанные. https://postgrespro.ru/docs/postgrespro/9.5/indexes-partial