27.5.2 Алгоритмы обработки представлений
Необязательная ALGORITHM определяющая CREATE VIEW или ALTER VIEW — это расширение MySQL по отношению к стандартному SQL. Оно влияет на то, как MySQL обрабатывает представление. ALGORITHM принимает три значения: MERGE, TEMPTABLE или UNDEFINED.
Для
MERGEтекст запроса, ссылающегося на представление, и определение представления объединяются таким образом, что части определения представления заменяют соответствующие части запроса.Для
TEMPTABLEрезультаты из представления извлекаются во временную таблицу, которая затем используется для выполнения запроса.Для
UNDEFINEDMySQL выбирает алгоритм, который будет использовать. Он предпочитает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.