У меня есть запрос, который выполняется для таблицы (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