Я использую copy_expert из psycopg2 для чтения (большого количества) данных из таблицы, используя запрос speci c, поскольку мне не нужна вся таблица. Он работает нормально так:
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 также выполняется намного быстрее. Как я могу сделать это чтение данных быстрее? Могу ли я как-нибудь воспользоваться потоком / пулом запроса? Должен ли я добавить индексы в таблицу, чтобы сделать запрос быстрее?
Любая помощь или комментарии приветствуются.