Spec-Zone .ru
спецификации, руководства, описания, API
|
Дополнительное ALGORITHM
пункт для CREATE VIEW
или ALTER
VIEW
расширение MySQL стандартного SQL. Это влияет, как MySQL обрабатывает представление. ALGORITHM
принимает три значения: MERGE
, TEMPTABLE
, или UNDEFINED
. Алгоритм значения по умолчанию
UNDEFINED
если нет ALGORITHM
пункт присутствует.
Для MERGE
, текст оператора, который обращается к представлению и определению
представления, объединяется так, что, части определения представления заменяют соответствующие части оператора.
Для TEMPTABLE
, следствия представления получаются во временную таблицу, которая
тогда используется, чтобы выполнить оператор.
Для UNDEFINED
, MySQL выбирает который алгоритм использовать. Это предпочитает MERGE
TEMPTABLE
если возможный, потому что MERGE
обычно более эффективно и потому что представление не может быть обновляемым,
если временная таблица используется.
Причина выбрать 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) ASSELECT 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);
Эффективно, у оператора, который будет выполнен, есть a WHERE
пункт этой формы:
WHERE (select WHERE) AND (view WHERE)
Если MERGE
алгоритм не может использоваться, временная таблица должна
использоваться вместо этого. MERGE
не может использоваться, если представление
содержит какую-либо из следующих конструкций: