使用psycopg2从python 3使用redshift进行缓慢更新查询

时间:2018-11-27 21:19:32

标签: python-3.x amazon-redshift psycopg2

我正在使用此代码更新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 :(得分:0)

您应该使用ETL做事的方式来思考而不是逐一讨论并进行更新,我认为这样做会更快。应在几分钟内处理30K记录。这是方法。

  1. 创建一个临时表,例如stg_my_table (id,outlier_reason)
  2. 根据您的情况,将Python程序数据写入CSV文件或JSON文件。将其保存到S3EC2
  3. 使用copy command与ID一起加载到stg_my_table中。
  4. 使用ID将my_tablestg_my_table结合在一起,对outlier_reason进行更新,并设置id

我认为上述解决方案必须将处理时间从2小时减少到几分钟。 请在编写实际代码之前手动尝试这种方式。我相信您会看到非常有希望的结果,然后一步一步地优化上述每个步骤,甚至可以获得更高的性能。