【问题标题】:Reading data faster from postgreSQL table with query with psycopg2 copy_expert使用 psycopg2 copy_expert 从 postgreSQL 表中更快地读取数据
【发布时间】: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。

【问题讨论】:

    标签: python postgresql performance psycopg2


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-29
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 2011-06-01
      • 1970-01-01
      相关资源
      最近更新 更多