@Ivanoff-i

Как можно максимально ускорить выборку с низкой селективностью из таблицы с сотнями миллионов записей?

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

  1. Неужели нужно создавать под каждый город отдельные таблицы?
  2. Если создавать отдельные таблицы под каждый город, то как быть если нужно фильтровать по другим столбцам, не по городу?
  3. Читал немного про PgPool 2 и его возможность параллельных запросов. Если сделать партицирование по id и использовать параллельные запросы сразу ко всем партициям, вариант ли это? И сможет ли pgpool сделать это в рамках одной машины?
  4. Как еще можно оптимизировать?
  5. Справится ли вообще одна машина с этой задачей? Где-то читал, люди пишут, что у них пару миллиардов записей в постгресе летают на одной машине даже при достаточно сложных запросах. Как так?
  • Вопрос задан
  • 410 просмотров
Пригласить эксперта
Ответы на вопрос 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Приводите базу к ДНФ3.
Для текущего случая: все города должны быть в отдельной таблице - список городов с ID-шниками.
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
Какие индексы есть? Структура таблицы?
explain (analyze, buffers)?

1. не нужно
2. см. 1
3. если вы упираетесь в CPU, а не в диск. Если в диск - сделает только хуже.
4. сначала выяснить, как ведёт себя имеющаяся табличка. Потом думать. Например, brin по id города. На низкоселективных полях получится внятный компактный индекс.
5. 200гб вполне себе нормальная база. Даже не астрономически дорого целиком в shared_buffers разместить.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы