27.6.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.