Насколько эффективен Google App Engine ndb.удалить мульти()?


Я работаю над тем, чтобы очистить мою базу данных от ~10 000 сущностей, и мой план состоит в том, чтобы поместить ее в задачу, которая удаляет 200 за один раз с помощью ndb.delete_multi(), а затем рекурсивно вызывает себя снова, пока не останется никаких сущностей.

На данный момент у меня еще нет рекурсии, поэтому я могу запустить код несколько раз вручную и проверить наличие ошибок, использование квот и т. д. Код:

entities = MyModel.query_all(ndb.Key('MyModel', '*defaultMyModel')).fetch(200)
key_list = ndb.put_multi(entities)
ndb.delete_multi(key_list)

Все, что делает query_all(), - это запрашивает MyModel и возвращает все.

Я провел некоторые испытания с помощью комментируя вещи и запуская метод, и похоже, что первые две строки занимают ожидаемое количество записей (~200).

Запуск третьей строки, ndb.delete_multi(), занимает около 8% от моего ежедневного пособия на 50 000 записей, поэтому около 4000 записей-в 20 раз больше, чем я думаю, что это должно быть сделано.

Я также убедился,что key_list содержит только 200 ключей с регистрацией.

Есть идеи, почему это занимает так много времени? Я использую этот метод неправильно? Или он просто использует тонну память? В таком случае, есть ли у меня способ сделать это более эффективно?

Спасибо.

2 2

2 ответа:

Ваш пример кода крайне неэффективен. Если вы удаляете большое количество сущностей, чем вам нужно будет паковать ниже, но, вы должны получить данные с помощью запроса keys_only, а затем удалить:

from google.appengine.ext import ndb

ndb.delete_multi(
    MyModel.query().fetch(keys_only=True)
)

Что касается количества операций записи (см. ответ Андрея), убедитесь, что только поля в вашей модели, которые должны быть проиндексированы, "имеют включенный индекс".

При удалении сущности хранилище данных должно удалить сущность и запись из индекса для каждого индексируемого свойства, а также для каждого пользовательского индекса. Количество записей не зависит от того, какой метод удаления вы используете.