Алгоритмы представлений
Описание
Оператор CREATE VIEW принимает необязательный оператор ALGORITHM, являющийся расширением стандартного SQL для Представлений.
Он может содержать одно из трёх значений: MERGE, TEMPTABLE или UNDEFINED, и влияет на то, как MariaDB будет обрабатывать представление.
При MERGE определение представления и соответствующая часть оператора, относящаяся к представлению, объединяются. Если выбран TEMPTABLE, результаты представления хранятся во временной таблице.
MERGE обычно более эффективен, и представление может быть обновлено только с этим алгоритмом. TEMPTABLE может быть полезным в определённых ситуациях, так как блокировки на базовых таблицах могут быть освобождены до завершения обработки оператора.
Если это UNDEFINED (или оператор ALGORITHM не используется), MariaDB выберет, что, по его мнению, является лучшим алгоритмом. Алгоритм также может быть UNDEFINED, если он определён как MERGE, но представление требует временной таблицы.
Представления с определением ALGORITHM=MERGE или ALGORITHM=TEMPTABLE случайно менялись местами между MariaDB и MySQL. При обновлении необходимо повторно создавать представления, созданные с одним из этих определений (см. MDEV-6916).
Ограничения MERGE
Представление не может быть типа ALGORITHM=MERGE, если оно использует какой-либо из следующих элементов:
- HAVING
- LIMIT
- GROUP BY
- DISTINCT
- UNION
- UNION ALL
- Агрегация функция, например MAX(), MIN(), SUM() или COUNT()
- Подзапрос в списке SELECT
- Если у него нет базовой таблицы, потому что он ссылается только на литеральные значения
Примеры MERGE
Пример 1
Вот пример того, как MariaDB обрабатывает представление с алгоритмом MERGE. Рассмотрим представление, определённое следующим образом:
CREATE ALGORITHM = MERGE VIEW view_name (view_field1, view_field2) AS SELECT field1, field2 FROM table_name WHERE field3 > '2013-06-01';
Теперь, если мы выполним запрос на этом представлении, как следует:
SELECT * FROM view_name;
для выполнения представления view_name становится базовой таблицей, table_name, * становятся полями view_field1 и view_field2, соответствующими field1 и field2, и условие WHERE, WHERE field3 > 100 добавляется, так что фактический выполняемый запрос:
SELECT field1, field2 FROM table_name WHERE field3 > '2013-06-01'
Пример 2
Учитывая то же самое представление, что и выше, если мы выполним запрос:
SELECT * FROM view_name WHERE view_field < 8000;
всё происходит так же, как и в предыдущем примере, но view_field < 8000 принимает соответствующее имя поля и становится field1 < 8000, связанное с AND с частью запроса field3 > '2013-06-01'.
Таким образом, результирующий запрос:
SELECT field1, field2 FROM table_name WHERE (field3 > '2013-06-01') AND (field1 < 8000);
При подключении с AND, добавляются скобки, чтобы гарантировать правильный приоритет.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/view-algorithms/