Как временно отключить Django индексы (для SQLite) - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь создать большую базу данных SQLite из примерно 500 небольших баз данных (каждая по 50-200 МБ), чтобы поместить их в Django, и хотел бы ускорить этот процесс. Я делаю это с помощью пользовательской команды.

Этот ответ мне очень помог, уменьшив скорость примерно до минуты каждый при обработке меньшей базы данных. Однако это все еще довольно долго.

Единственное, что я не сделал в этом ответе, - это отключил индексирование базы данных в Django и воссоздаю их. Я думаю, что это важно для меня, так как в моей базе данных есть несколько таблиц с множеством строк.

Есть ли способ сделать это в Django, когда он работает вживую? Если не в Django, то, возможно, существует какой-то запрос SQLite, чтобы удалить все индексы и воссоздать их после того, как я вставлю свои записи?

1 Ответ

0 голосов
/ 17 апреля 2020

Я просто использовал raw SQL, чтобы удалить индексы и воссоздать их. Это улучшило скорость создания большой базы данных из 2 моих маленьких баз данных с 1:46 до 1:30, что очень важно. Он также уменьшил размер с 341,7 МБ до 321,1 МБ.

# Delete all indexes for faster database creation
with connection.cursor() as cursor:
    cursor.execute(f'SELECT name, sql FROM sqlite_master WHERE name LIKE "{app_label}_%" AND type == "index"')
    indexes = cursor.fetchall()
    names, create_sqls = zip(*indexes)
    for name in names:
        cursor.execute(f'DROP INDEX {name}')

После создания баз данных заново создайте индекс:

# Re-create indexes
with connection.cursor() as cursor:
    for create_sql in create_sqls:
        cursor.execute(create_sql)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...