使用 psycopg2 copy_expert 从 postgreSQL 表中更快地读取数据
Posted
技术标签:
【中文标题】使用 psycopg2 copy_expert 从 postgreSQL 表中更快地读取数据【英文标题】:Reading data faster from postgreSQL table with query with psycopg2 copy_expert 【发布时间】:2020-04-26 09:05:17 【问题描述】:我正在使用来自 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 中进行查询也快得多。我怎样才能更快地读取数据?我可以以某种方式利用线程/池查询吗?我应该向表中添加索引以加快查询速度吗?
感谢任何帮助或 cmets。
【问题讨论】:
【参考方案1】:我想通了。在我的例子中,symbol 列代表了表中相当大的数据组,并在其上创建一个简单的 b-tree 索引使查询在 2 秒内运行,而 50 秒:
CREATE INDEX symbol_idx ON mytable USING btree ("symbol")
【讨论】:
以上是关于使用 psycopg2 copy_expert 从 postgreSQL 表中更快地读取数据的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 psycopg2 从 Amazon Redshift 读取数据
使用 Psycopg2 从 Redshift 写入文件引发异常
使用 Psycopg2 将数据从 S3 复制到 AWS Redshift 时出错
使用 psycopg2 从 python 3 使用 redshift 进行慢速更新查询
psycopg2/python 将数据从 postgresql 复制到 Amazon RedShift(postgresql)