Я думаю, правильное сравнение будет:
REFRESH MATERIALIZED VIEW bar;
против
CREATE TABLE bar (....);
INSERT INTO bar
SELECT * FROM FOO;
Поскольку MV вы можете сделать это один раз, и обновить, когда вам нужно сделать выбор (и даже сэкономить некоторые вызовы, если вы знаете, как часто меняется информация)
Также вы можете предоставить и индексировать MV, а у вас нет другого пути. Конечно, это будет способствовать производительности MV только для больших наборов результатов.
В postgres вы также можете сделать это:
REFRESH MATERIALIZED VIEW CONCURRENTLY bar;
чтобы обновить его двумя параллельными процессами, если один не закончился, а другому нужна информация до этого момента времени. Я предполагаю, что некоторая оптимизация сделана для повторного использования материала из запущенного запроса.
Это то, что вы не можете сделать с помощью SELECT INSERT INTO.