views as $view) { // CONCURRENTLY использует временные таблицы и local (temp) buffers для // diff'а старых и новых данных. На больших представлениях стандартного // temp_buffers (8MB) не хватает — PostgreSQL падает с "no empty local // buffer available". temp_buffers можно изменить только до первого // обращения к временным таблицам в сессии, поэтому под каждое // представление берём свежее соединение и сразу поднимаем temp_buffers. DB::reconnect(); DB::statement("SET temp_buffers = '{$this->tempBuffers}'"); // CONCURRENTLY не блокирует чтение представления во время обновления, // но требует наличия уникального индекса на представлении и не может // выполняться внутри транзакции (DB::statement работает в autocommit). DB::statement("REFRESH MATERIALIZED VIEW CONCURRENTLY {$view}"); DB::statement("ANALYZE {$view}"); } } }