Чтение данных быстрее из таблицы postgreSQL по запросу с помощью psycopg2 copy_expert - PullRequest
0 голосов
/ 26 апреля 2020

Я использую 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 также выполняется намного быстрее. Как я могу сделать это чтение данных быстрее? Могу ли я как-нибудь воспользоваться потоком / пулом запроса? Должен ли я добавить индексы в таблицу, чтобы сделать запрос быстрее?

Любая помощь или комментарии приветствуются.

1 Ответ

0 голосов
/ 26 апреля 2020

Я понял это. В моем случае столбец symbol представлял достаточно большие группы данных в таблице, и создание простого индекса b-дерева по нему заставило запрос выполняться за 2 секунды по сравнению с 50 секундами:

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