Django сохраняет и замедляет обновления на многораздельной таблице, но запросы выполняются намного быстрее - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть идентичные таблицы в Postgres9 и Postgres10, за исключением того, что таблица Postgres10 разделена по состоянию.В обеих таблицах содержится около 80 миллионов записей

Когда я делаю такой запрос, в секционированной таблице он примерно в 10 раз быстрее, чем в неразделенной таблице Postgres9.ура!

# This is fast with a partition, and slow without
parcels = Parcel.objects.filter(state='15', boundary__intersects=polygon)

Однако, когда я пытаюсь сделать обновление через Django, оно примерно в 1000 раз медленнее на многораздельной таблице (это занимает около 2 минут), чем на Postgres9версия:

for parcel in parcels:
    do something
    # This is slow with a partition, and fast without
    parcel.save()

Но когда я делаю обновление напрямую через psql, оно работает очень быстро на секционированной таблице в Postgres10 и довольно медленно на нераспределенной таблице в Postgres9:

# This is fast with a partition, and slow without
UPDATE parcel SET field=42 WHERE state='15' AND parcel_id='someid';

Почему мой вызов save в Django будет намного медленнее, чем обновление напрямую через psql?Есть ли эквивалент QuerySet.explain() для save операций?

1 Ответ

0 голосов
/ 08 декабря 2018

Причина, по которой Postgres10 был медленнее, чем Postgres9, заключалась в том, что в многораздельных таблицах первичный ключ родительского элемента не допускается.Поэтому мой вызов parcel.save() пытался выполнить запрос, подобный UPDATE parcel SET field=42 WHERE "id" = 'someid';, но запрос по идентификатору был чрезвычайно медленным для многораздельной таблицы.

Я исправил это, добавив первичный ключ к каждой из дочерних таблиц,Например, ALTER TABLE parcel_01 ADD PRIMARY KEY (id);.Когда я добавил его для каждого ребенка, это имело аналогичный эффект, и мое время обновления сократилось на 99,9%.В целом, использование секционированной таблицы с Postgres10 уменьшило общее время выполнения инструмента, над которым я работаю, на 75% (с 40 минут до 10)

Я хочу поблагодарить @ 2ps за предложение посмотреть насгенерированный SQL, и для предложения способа принудительного запроса, который я хотел, без использования первичного ключа.

...