Spec-Zone.ru › MySQL 8.4

27.5.2 Алгоритмы обработки представлений

Необязательная ALGORITHM определяющая CREATE VIEW или ALTER VIEW — это расширение MySQL по отношению к стандартному SQL. Оно влияет на то, как MySQL обрабатывает представление. ALGORITHM принимает три значения: MERGE, TEMPTABLE или UNDEFINED.

  • Для MERGE текст запроса, ссылающегося на представление, и определение представления объединяются таким образом, что части определения представления заменяют соответствующие части запроса.

  • Для TEMPTABLE результаты из представления извлекаются во временную таблицу, которая затем используется для выполнения запроса.

  • Для UNDEFINED MySQL выбирает алгоритм, который будет использовать. Он предпочитает MERGE перед TEMPTABLE, если это возможно, так как MERGE обычно более эффективен, и представление нельзя обновить, если используется временная таблица.

  • Если запрос не содержит ALGORITHM определяющей алгоритм обработки представления, по умолчанию используется алгоритм, определяемый значением флага derived_merge системной переменной optimizer_switch. Дополнительные сведения см. в Разделе 10.2.2.4, «Оптимизация производных таблиц, ссылок на представления и выражений с общими таблицами с помощью слияния или материализации».

Причина для явного указания TEMPTABLE заключается в том, что блокировки на базовых таблицах могут быть освобождены после создания временной таблицы и до её использования для завершения обработки запроса. Это может привести к более быстрому освобождению блокировок, чем при использовании алгоритма MERGE, так что другие клиенты, использующие представление, не будут заблокированы так долго.

Алгоритм обработки представления может быть UNDEFINED по трём причинам:

  • Запрос CREATE VIEW не содержит ALGORITHM определяющей алгоритм обработки представления.

  • Запрос CREATE VIEW содержит явное ALGORITHM = UNDEFINED определение алгоритма обработки представления.

  • ALGORITHM = MERGE задан для представления, которое может быть обработано только с помощью временной таблицы. В этом случае MySQL генерирует предупреждение и устанавливает алгоритм обработки представления в UNDEFINED.

Как уже упоминалось, обработка MERGE осуществляется путём объединения соответствующих частей определения представления в запрос, ссылающийся на это представление. Следующие примеры кратко иллюстрируют, как работает алгоритм MERGE. Примеры предполагают, что существует представление v_merge, имеющее следующее определение:

CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS
SELECT c1, c2 FROM t WHERE c3 > 100;

Пример 1: Предположим, что мы выполняем следующий запрос:

SELECT * FROM v_merge;

MySQL обрабатывает запрос следующим образом:

  • v_merge становится t

  • * становится vc1, vc2, что соответствует c1, c2

  • Добавляется фрагмент представления WHERE

Результирующий запрос, подлежащий выполнению, становится:

SELECT c1, c2 FROM t WHERE c3 > 100;

Пример 2: Предположим, что мы выполняем следующий запрос:

SELECT * FROM v_merge WHERE vc1 < 100;

Этот запрос обрабатывается аналогично предыдущему, за исключением того, что vc1 < 100 становится c1 < 100, и фрагмент представления WHERE добавляется к запросу WHERE с использованием соединителя AND (и добавляются скобки, чтобы гарантировать, что части фрагмента выполняются с правильным приоритетом). Результирующий запрос, подлежащий выполнению, становится:

SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100);

По сути, запрос, подлежащий выполнению, имеет фрагмент WHERE следующего вида:

WHERE (select WHERE) AND (view WHERE)

Если алгоритм MERGE не может быть использован, вместо него должна использоваться временная таблица. Конструкции, препятствующие слиянию, совпадают с конструкциями, препятствующими слиянию в производных таблицах и выражениях с общими таблицами. Примерами являются SELECT DISTINCT или LIMIT в подзапросе. Для получения подробностей см. Раздел 10.2.2.4, «Оптимизация производных таблиц, ссылок на представления и выражений с общими таблицами с помощью слияния или материализации».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/view-algorithms.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API