Задать вопрос
tamaz1987
@tamaz1987
Умный, красивый

Долгая обработка SQL запроса?

Добрый день.
Изучаю python и работу с SQLite3.
Очень смущает долгая обработка запроса.
Имеем VPS сервер 1 ядро в 2.5 ГГЦ и оперативки в 2 ГБ.
SQLite3 база с двумя таблицами. Записей в одной 11 миллионо в другой 3 миллиона.
требования из первой таблицы удалить все значения которые есть во второй. Сверка по одному столбцу.
Код в python который это делает:
print('Запуск удаления проверенных юзеров')
    step = 0
    cur.execute('''SELECT user_full_data_user_id FROM user_full_data''')
    user_parsing_ok = cur.fetchall()
    korteg = ()
    for k in user_parsing_ok:
        korteg += k
        step += 1
    cur.execute(f'''DELETE FROM parsing
                    WHERE parsing_user_id IN {korteg}''')
    con.commit()
    cur.execute('''VACUUM''')  # Сжимаем таблицу удаляя пустые строки в ней
    print(f'Строк проверенно {step}')

Данный код на удаленной машине выполняется уже 10 часов и еще не завершился.
ПОчему так медленно. Это ограничания SQLite3, сам Python медленный или я написал кривой код?
  • Вопрос задан
  • 63 просмотра
Подписаться 1 Простой 7 комментариев
Пригласить эксперта
Ответы на вопрос 1
Lord_of_Rings
@Lord_of_Rings
Дунадан - северный странник. Злой, но очень добрый
Можно использовать подзапрос вместо двух запросов и цикла, если я не ошибаюсь
cur.execute('''DELETE FROM parsing
               WHERE parsing_user_id IN (SELECT user_full_data_user_id FROM user_full_data)''')
Ну и, конечно, sqlite - это не для таких БД

P. S. Можно ещё индексы сделать к столбцам
CREATE INDEX idx_user_full_data_user_id ON user_full_data(user_full_data_user_id);
CREATE INDEX idx_parsing_user_id ON parsing(parsing_user_id);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы