Разделение таблиц Postgres не улучшает скорость запросов - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть запрос, который выполняется для таблицы (TABLE_A), которая разделена по recTime ……

WITH subquery AS ( 
select count(*) AS cnt, date_trunc('day',recTime) AS recTime 
from TABLE_A 
WHERE (recTime >= to_timestamp('2018-Nov-03 00:00:00','YYYY-Mon-DD HH24:MI:SS') 
   AND recTime <= to_timestamp('2018-Nov-03 23:59:59','YYYY-Mon-DD HH24:MI:SS')) 
GROUP BY date_trunc('day',recTime) 
) 
UPDATE sumDly 
SET fixes = subquery.cnt 
FROM subquery 
WHERE 
  sumDly.Day = subquery.recTime

Если я сделаю объяснение в запросе, как показано выше, очевидно, что база данных выполняет сканирование индекса для каждого раздела в родительской таблице. Соответствующая стоимость высока, а истекшее время смешно.

Если я явно принудительно использую раздел, в котором есть данные, заменив….

 from TABLE_A 

С ....

from TABLE_A_20181103

Тогда объяснение использует только необходимый раздел, и запрос занимает всего несколько минут (и возвращаемые результаты такие же, как и раньше)

ВОПРОС - Почему база данных хочет сканировать все разделы в таблице? Я думал, что вся идея секционирования заключалась в том, чтобы помочь базе данных устранить обширные массивы ненужных данных при первом проходе, а не принудительно сканировать все индексы в отдельных разделах?


ОБНОВЛЕНИЕ - Я использую Postgres версии 10.5

1 Ответ

0 голосов
/ 05 апреля 2019

SET constraint_exclusion = on и убедитесь, что вы жестко закодировали ограничения в запросе. Обратите внимание, что вы действительно жестко закодировали ограничения в запросе:

...
WHERE (recTime >= to_timestamp('2018-Nov-03 00:00:00','YYYY-Mon-DD HH24:MI:SS') 
   AND recTime <= to_timestamp('2018-Nov-03 23:59:59','YYYY-Mon-DD HH24:MI:SS'))
... 
...