Я отлаживаю возможную ошибку производительности в django-reversion (библиотека django).Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я запускаю django-reversion createinitialrevisions
, моей БД будет требоваться огромное количество времени для обработки того, что происходит.
Я включил Performance Insights в RDS иЯ вижу, что запрос, который убивает мою БД, выглядит следующим образом:
SELECT "table_a"."id"
FROM "table_a"
WHERE NOT (CAST("table_a"."id" as text) IN (
SELECT U0."object_id"
FROM "reversion_version" U0
WHERE (U0."content_type_id" = 49 AND U0."db" = 'default')
))
Если я правильно понимаю, что я читаю здесь https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/, оказывается, что PostgreSQL не может оптимизировать то же самоеспособ NOT IN
, чем LEFT JOIN
.Вот почему я решил переписать этот запрос и посмотреть, будет ли выполняться столько же времени.
Вот результат после его переписывания:
SELECT "table_a"."id"
FROM "table_a"
LEFT JOIN
"reversion_version" U0
ON U0."object_id" = "table_a"."id"::text
WHERE U0."object_id" IS NULL AND U0."content_type_id" = 49 AND U0."db" = 'default'
Я должен был что-то сделатьнеправильно, потому что я получаю разные результаты.Мой запрос (переписанный) вообще ничего не возвращает.
Что я пропустил?