23.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. Дополнительные сведения см. в Разделе 8.2.2.4, «Оптимизация производных таблиц и ссылок на представления с объединением или материализацией».
Причина для явного указания TEMPTABLE заключается в том, что блокировки на базовых таблицах могут быть освобождены после создания временной таблицы и до её использования для завершения обработки инструкции. Это может привести к более быстрому освобождению блокировок, чем с алгоритмом MERGE, так что другие клиенты, использующие представление, не будут блокированы так долго.
Алгоритм обработки представления может быть UNDEFINED по трём причинам:
Определения
ALGORITHMнет в инструкцииCREATE VIEW.В инструкции
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 в подзапросе. Подробнее см. Раздел 8.2.2.4, «Оптимизация производных таблиц и ссылок на представления с объединением или материализацией».
© 2025 Oracle
Licensed under the GPLv2 License.