медленный запрос на обновление с красным смещением из python 3 с использованием psycopg2 - PullRequest
0 голосов
/ 28 ноября 2018

Я использую этот код для обновления нескольких записей в Redshift (около 30 000 записей за цикл).

cur = conn.cursor(cursor_factory=RealDictCursor)
sql_string_update = """UPDATE my_table SET "outlier_reason" = {0} WHERE "id" = {1};"""
for id, row in df_ignored.iterrows():
    sql_ = sql_string_update.format(row['outlier_reason'],id)
    cur.execute(sql_)
conn.commit()

Каждый запуск около 30 000 элементов занимает до 2 часов выполнения.

Есть ли способ ускорить этот запрос?

1 Ответ

0 голосов
/ 28 ноября 2018

Думая, вместо того чтобы прикасаться к столу и делать обновления один за другим, вы должны использовать ETL-способ ведения дел, я считаю, что это будет намного быстрее.Должен позаботиться о 30K записей за несколько минут.Вот подход.

  1. Создайте промежуточную таблицу, скажем stg_my_table (id,outlier_reason).
  2. Запишите данные своих программ Python в файл CSV или JSON, в зависимости от того, что подходит вашему случаю.Сохраните его в S3 или EC2.
  3. . Используйте copy команду для загрузки в stg_my_table вместе с ID.
  4. Обновите my_table с помощьюсоединяя его с stg_my_table, используя идентификатор и устанавливая outlier_reason.

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

...