首页 > 解决方案 > 使用 psycopg2 copy_expert 从 postgreSQL 表中更快地读取数据

问题描述

我正在使用psycopg2 中的copy_expert使用特定查询从表中读取(大量)数据,因为我不需要整个表。它像这样工作正常:

s_buf = io.StringIO()
conn = self.conn

cur = conn.cursor()
query = f"""
    copy 
    (select {",".join(columns)} from {self.table}
    where symbol in {tuple(data)})
    to STDOUT WITH (FORMAT csv, DELIMITER '\t')
    """
cur.copy_expert(query, s_buf, size=8192)
s_buf.seek(0)
return list(csv.DictReader(s_buf, delimiter="\t", fieldnames=columns))

在这里,data是一个包含 150 个值的列表。结果输出有 800.000 行,这并不多。但是,copy_expert查询需要将近 50 秒,这太慢了。我知道从 SQL 读取数据的速度通常比这快得多,并且在 dBeaver 中进行查询也快得多。我怎样才能更快地读取数据?我可以以某种方式利用线程/池查询吗?我应该向表中添加索引以加快查询速度吗?

任何帮助或意见表示赞赏。

标签: pythonpostgresqlperformancepsycopg2

解决方案


我想到了。在我的例子中,符号列代表表中相当大的数据组,并在其上创建一个简单的 b-tree 索引使查询在 2 秒内运行,而 50 秒:

CREATE INDEX symbol_idx ON mytable USING btree ("symbol")

推荐阅读