Как заменить IN в запросе SQL, содержащем много параметров, на Postgresql? - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь получить информацию из базы данных, используя кортеж Python, содержащий набор идентификаторов (от 1000 до 10000 идентификаторов), но мой запрос использует оператор IN и впоследствии очень медленный.

query = """ SELECT * 
            FROM table1
            LEFT JOIN table2 ON table1.id = table2.id
            LEFT JOIN ..
            LEFT JOIN ...
            WHERE table1.id IN {} """.format(my_tuple)

и затем я запрашиваю базу данных, используя PostgreSQL, чтобы зарядить результат в Pandas фрейме данных:

with tempfile.TemporaryFile() as tmpfile:
            copy_sql = "COPY ({query}) TO STDOUT WITH CSV {head}".format(
               query=query, head="HEADER"
            )
            conn = db_engine.raw_connection()
            cur = conn.cursor()
            cur.copy_expert(copy_sql, tmpfile)
            tmpfile.seek(0)
            df = pd.read_csv(tmpfile, low_memory=False)

Я знаю, что IN не очень эффективен с большим количеством параметры, но я не имею ни малейшего представления, чтобы оптимизировать эту часть запроса. Любой намек?

1 Ответ

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

Вы можете отладить ваш запрос, используя объяснение . Возможно, вы пытаетесь последовательно прочитать большую таблицу, при этом вам нужно всего несколько строк. Индексируется ли поле table1.id?

Или вы можете сначала попытаться отфильтровать table1, а затем начать объединение

with t1 as (
 select f1,f2, .... from table1 where id in {}
)
select *
from t1
 left join ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...