Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


20.5.2 ビュー処理アルゴリズム

CREATE VIEW または ALTER VIEW のオプションの ALGORITHM 句は、標準 SQL に対する MySQL 拡張です。これは、MySQL によるビューの処理方法に影響を与えます。ALGORITHM は、MERGETEMPTABLE、または UNDEFINED の 3 つの値を受け取ります。ALGORITHM 句が存在しない場合、デフォルトのアルゴリズムは UNDEFINED です。

MERGE の場合、ビューを参照するステートメントのテキストとビュー定義がマージされ、ビュー定義の部分が対応するステートメントの部分と置き換えられます。

TEMPTABLE の場合、ビューの結果が一時テーブル内に取得され、その後、ステートメントを実行するために使用されます。

UNDEFINED の場合、MySQL は使用するアルゴリズムを選択します。できるかぎり TEMPTABLE より MERGE が優先されます。これは通常、MERGE のほうが効率性が高く、一時テーブルを使用するとビューを更新できなくなるためです。

明示的に TEMPTABLE を選択する理由は、一時テーブルが作成されたあとで、ステートメントの処理を終了するために使用される前に、ベースとなるテーブルでロックを解放できるからです。その結果、MERGE アルゴリズムよりもすみやかにロックが解除され、ビューを使用するほかのクライアントが長時間ブロックされることがなくなります。

次の 3 つの理由によって、ビューアルゴリズムを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_merget になる

  • *vc1, vc2 となり、c1, c2 と一致する

  • ビュー WHERE 句が追加される

結果が実行されるステートメントは次のようになります。

SELECT c1, c2 FROM t WHERE c3 > 100;

例 2: 次のステートメントを発行するとします。

SELECT * FROM v_merge WHERE vc1 < 100;

このステートメントは、前述のステートメントと同様に処理されますが、vc1 < 100c1 < 100 になり、AND 連結詞を使用してビュー WHERE 句がステートメント WHERE 句に追加される点が異なります (また、句の一部が確実に正しい優先順位で実行されるように、かっこが追加されます)。結果が実行されるステートメントは次のようになります。

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

事実上、実行されるステートメントには、次の形式の WHERE 句が含まれます。

WHERE (select WHERE) AND (view WHERE)

MERGE アルゴリズムを使用できない場合、一時テーブルを代わりに使用する必要があります。ビューに次のいずれかの構造構文が含まれる場合、MERGE は使用できません。

  • 集計関数 (SUM()MIN()MAX()COUNT() など)

  • DISTINCT

  • GROUP BY

  • HAVING

  • LIMIT

  • UNION または UNION ALL

  • 選択リスト内のサブクエリー

  • リテラル値だけの参照 (この場合、ベースとなるテーブルがありません)