Созданы ли PostgreSQL VIEWS каждый раз, когда они запрашиваются?

Я создаю веб-приложение с несколькими сложными базовыми ассоциациями. Чтобы решить несколько вопросов, которые я создал, я создал UNION View. Вероятно, существует много других способов решения этой проблемы.

Но теперь я рассматриваю эффективность своего дизайна, и я хотел знать, если новый просмотр был создан каждый раз, когда он запрашивается, или он создается только один раз и обновляется.

Чтобы разработать, если у меня есть table_a (100 записей) и table_b (100 записей) и сделать UNION View, тогда я создал представление с 200 записями.

Выполняется ли весь этот процесс каждый раз, когда я делаю выбор против представления?

Опять же, очевидно, каждый раз, когда я обновляю базовые записи таблиц, обновление обновляется, но просматривает ли это обновление эту одну запись или воссоздает весь вид с нуля?

Дейл

Ответ 1

Вид - это не что иное, как запрос с именем. Существуют возможные оптимизационные функции, которые некоторые СУБД лучше других понимают (pgSQL, похоже, находится на лучшей стороне), например, повторное использование плана запроса, кэширование контроля доступа и т.д.

Однако, в конце этого дня, почти всегда, вы можете ожидать, что представление будет вести себя как выдача SQL напрямую. С той разницей, что вы можете предоставить доступ к этому запросу без предоставления доступа к базовым таблицам.

Есть оптимизация, которую вы можете сделать, чтобы изменить поведение (сделать их наполовину похожими на таблицу), и которые могут или не могут существовать в pgSQL, как материализованные представления (извините, не знаю, о pgSQL), но это просто nitpicking.

Ответ 2

Выполняется ли весь этот процесс каждый раз, когда я делаю выбор против представления?

Да.
Не материализованное представление (PostgreSQL не поддерживает материализованные представления) - это просто подготовленный оператор SQL - вы получите такую ​​же производительность, заменив ссылку на представление на подзапрос, содержащий SELECT, на основе которого основан вид.

Вот почему значения, основанные на поддерживающих таблицах, появляются каждый раз, когда вы запускаете запрос в представлении, я неясен, если обработчики столбцов становятся видимыми в PostgreSQL без обновления представления - IE: если вы создаете представление на основе SELECT * FROM table_x, а затем добавьте или удалите столбец из table_x - для большинства баз данных вам потребуется обновить представление, чтобы увидеть это изменение с помощью представления.

Построение взглядов сверху взглядов должно быть обескуражено - они хрупкие; вы не будете знать, пока не запустите просмотр, зависящий от другого, если есть проблема. И нет никакого выигрыша в производительности - скорее наоборот. Повторное использование кода не работает в среде на основе SET...

Ответ 3

Используйте EXPLAIN, чтобы увидеть, как выполняется VIEW, вы увидите те же результаты, что и обычный запрос.

EXPLAIN
SELECT * FROM name_of_your_view WHERE foo = 23;

PostgreSQL будет пытаться оптимизировать внутренний запрос, даже когда вы присоединяетесь к представлениям, имеете представления с использованием других представлений и т.д. Старайтесь избегать ситуаций, когда VIEW должен быть выполнен до того, как оптимизатор может выполнить эту (большую) работу. Агрегаты, ORDER BY и LIMIT являются примерами потенциальных проблем при использовании внутренних вложенных представлений. Просто используйте EXPLAIN, чтобы узнать, что происходит.