Созданы ли 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, чтобы узнать, что происходит.