Параллельные запросы на выборку, разделенные по идентификаторам строк и одному запросу - PullRequest
3 голосов
/ 01 июля 2019

Когда SELECT запрашивает одну таблицу l, нет объединений с миллиардами строк, это хорошая идея для запуска параллельных запросов, разделив запрос на несколько запросов, разделив их на отдельные подмножества / диапазоны по столбцу индексов, скажем целочисленный первичный ключ id? Или Postgres внутренне уже делает это, что не приводит к значительному увеличению скорости для конечного пользователя?

У меня есть два варианта использования:

  1. получение общего количества строк

  2. получение списка id s

Edit-1: Запрос содержит условное предложение для столбцов, в которых один из столбцов не проиндексирован, а остальные столбцы проиндексированы

SELECT id 
FROM l 
WHERE indexed_column-1='A' 
  AND indexed_column-2='B' 
  AND not_indexed_column-1='C'

Ответы [ 3 ]

3 голосов
/ 01 июля 2019

В случае, если вы хотите посчитать количество строк, вы можете просто позволить внутреннему распараллеливанию запросов в PostgreSQL. Это будет быстрее, и результат будет последовательным.

В случае, если вы хотите получить список первичных ключей, это зависит от условий WHERE запроса. Если вы выбираете только несколько строк, параллельный запрос будет работать хорошо.

Если вы хотите все id s таблицы, PostgreSQL, вероятно, не выберет параллельный план, потому что стоимость обмена таким количеством значений между рабочими процессами будет превышать Преимущества распараллеливания. В этом случае вы можете быть быстрее с параллельными сессиями, как вы предполагаете.

3 голосов
/ 01 июля 2019

Postgres имеет встроенное распараллеливание начиная с версии 9.6. (Улучшено в текущих версиях.) Это будет намного эффективнее, чем ручное разбиение SELECT на большую таблицу.

Вы можете установить число max_parallel_workers в соответствии с вашими потребностями для оптимизации.

Хотя вас интересует только столбец id, может оказаться полезным иметь индекс для (id) (если он указан в качестве PK) и выполнить предварительные условия для сканирования только по индексу .

0 голосов
/ 14 июля 2019

Этот составной индекс из 4 столбцов, вероятно, будет быстрее, чем при использовании параллелизма:

INDEX(indexed_column-1, indexed_column-2,  -- first, in either order
      not_indexed_column-1, id)
...