Есть таблица на несколько сотен миллионов записей. Около 200 Гб. В ней много столбцов, включая текстовые. Есть столбцы с низкой селективностью. Например, столбец город. Задача выбрать все, где город равен определенному значению. Например по СПБ порядка 10 млн. записей. Все их нужно вывести в файл. Т.е. запрос такого вида COPY (SELECT несколько полей ...) TO 'file.txt'. Сейчас они сохраняются полчаса. Никакие индексы не помогают. Причем если сделать не SELECT несколько полей, а SELECT id ... WHERE city = ..., то это происходит за несколько секунд. Если вынести записи по городу СПБ в отдельное материализованное представление, SELECT несколько полей ... происходит уже не полчаса, а полминуты.
- Неужели нужно создавать под каждый город отдельные таблицы?
- Если создавать отдельные таблицы под каждый город, то как быть если нужно фильтровать по другим столбцам, не по городу?
- Читал немного про PgPool 2 и его возможность параллельных запросов. Если сделать партицирование по id и использовать параллельные запросы сразу ко всем партициям, вариант ли это? И сможет ли pgpool сделать это в рамках одной машины?
- Как еще можно оптимизировать?
- Справится ли вообще одна машина с этой задачей? Где-то читал, люди пишут, что у них пару миллиардов записей в постгресе летают на одной машине даже при достаточно сложных запросах. Как так?