python - 使用 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 中进行查询也快得多。我怎样才能更快地读取数据?我可以以某种方式利用线程/池查询吗?我应该向表中添加索引以加快查询速度吗?
任何帮助或意见表示赞赏。
解决方案
我想到了。在我的例子中,符号列代表表中相当大的数据组,并在其上创建一个简单的 b-tree 索引使查询在 2 秒内运行,而 50 秒:
CREATE INDEX symbol_idx ON mytable USING btree ("symbol")
推荐阅读
- pandas - 如何在熊猫数据框中将 1 str 列拆分为 2 列
- python - 需要使用 pandas python 访问我的 excel 的索引,我想打印卖得最多的人和卖了多少
- javascript - 将javascript文件作为命令行参数读入Node并解析它
- c++ - 我需要帮助在 Windows 10 中使用 C++ 关闭系统进程
- apache - 无法将 IIS web.config URL Friendly 转换为 .htaccess mod_rewrite
- oracle-sqldeveloper - 如何从 Oracle SQLDeveloper 中导出已执行的语句?
- swift - 如何快速添加分页?
- c# - 什么时候在 C# Forms 中使用 KeyValue 而不是使用 KeyData?
- vue.js - 如何确定导致组件重新渲染的原因
- c - 使用指针而不是索引从字符串中删除一个字符(在 c 中)