У меня есть таблица в Postgres Thing
, которая содержит 100 миллионов строк.
У меня есть столбец, который был заполнен с течением времени и в котором хранятся некоторые ключи. Ключи были префикс перед хранением. Давайте назовем это prefixed_keys
.
Моя задача - использовать значения этого столбца, чтобы заполнить другой столбец теми же значениями, но с обрезанными префиксами. Давайте назовем это simple_keys
.
Я попробовал следующую миграцию:
from django.db import migrations
import time
def backfill_simple_keys(apps, schema_editor):
Thing = apps.get_model('thing', 'Thing')
batch_size = 100000
number_of_batches_completed = 0
while Thing.objects.filter(simple_key__isnull=True).exists():
things = Thing.objects.filter(simple_key__isnull=True)[:batch_size]
for tng in things:
prefixed_key = tng.prefixed_key
if prefixed_key.startswith("prefix_A"):
simple_key = prefixed_key[len("prefix_A"):]
elif prefixed_key.startswith("prefix_BBB"):
simple_key = prefixed_key[len("prefix_BBB"):]
tng.simple_key = simple_key
Thing.objects.bulk_update(
things,
['simple_key'],
batch_size=batch_size
)
number_of_batches_completed += 1
print("Number of batches updated: ", number_of_batches_completed)
sleep_seconds = 3
time.sleep(sleep_seconds)
class Migration(migrations.Migration):
dependencies = [
('thing', '0030_add_index_to_simple_key'),
]
operations = [
migrations.RunPython(
backfill_simple_keys,
),
]
Каждая партия заняла ~ 7 минут. Что означает, что на это уйдут дни! Это также увеличило время ожидания базы данных, используемой в производстве.