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

Posted

技术标签:

【中文标题】使用 psycopg2 从 python 3 使用 redshift 进行慢速更新查询【英文标题】:slow update query with redshift from python 3 using psycopg2 【发布时间】:2018-11-27 21:19:31 【问题描述】:

我正在使用此代码更新 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 小时的执行时间。

有没有办法加快这个查询?

【问题讨论】:

您正在数据库上运行 30.000 次更新,这不可能变得更快。我的建议是创建一个逻辑 1. 在 S3 中为 insert 新行创建一个文件 2. delete 需要更新的行。 3.使用copy将数据从S3加载到Redshift。如果您需要更多说明,请告诉我 【参考方案1】:

在想,与其碰表并一一进行更新,不如使用ETL的做事方式,我相信这样会快很多。应该在几分钟内处理 30K 条记录。这是方法。

    创建一个临时表,比如stg_my_table (id,outlier_reason)。 将您的 Python 程序数据写入 CSV 文件或 JSON 文件,无论您的情况如何。将其保存到S3EC2。 使用copycommand连同ID一起加载到stg_my_table中。 通过使用 ID 与 stg_my_table 连接并设置 outlier_reason 来更新到 my_table

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

【讨论】:

感谢您的回答。听起来工作量很大。我试试看,可惜没有更简单的解决方案。 @otmezger Redshift 不是为非常频繁的更新而设计的,当然也不是作为其列式数据库的单个记录更新。

以上是关于使用 psycopg2 从 python 3 使用 redshift 进行慢速更新查询的主要内容,如果未能解决你的问题,请参考以下文章

psycopg2/python 将数据从 postgresql 复制到 Amazon RedShift(postgresql)

如何为 Python 3.x 安装 psycopg2?

使用 Amazon Redshift 从 Python psycopg2 中的游标获取大于 MAX INT 的行数

安装 psycopg2 osx 10.12 python 3.5.2 - psycopg2 的构建轮失败

无法使用 psycopg2 从 Amazon Redshift 读取数据

使用 Psycopg2 从 Redshift 写入文件引发异常