生成列

生成列は表に定義されます。 生成列に格納される値は、式を使って計算された値です。 挿入操作や更新操作で指定された値ではありません。

作成する表で、特定の式や述部を頻繁に使用することが分かっている場合、 その表に 1 つまたは複数の生成列を追加することができます。 生成列を使用すると、 表データを照会する際のパフォーマンスを向上させることができます。

例えば、パフォーマンスが重要な場合、 式の評価のコストを高める恐れのある要因が 2 つあります。
  1. 照会中に式の評価を何度も行わなければならないこと。
  2. 計算が複雑であること。

照会のパフォーマンスを向上させるには、 式の結果を入れるために、列をもう 1 つ定義することができます。 そうすれば、同じ式を含んだ照会を発行するときに、生成列を直接に使用できます。 あるいは、オプティマイザーの照会書き直しコンポーネントで、 その式を生成列に置き換えることもできます。

照会時に複数の表のデータを結合する場合、生成列を追加すると、 オプティマイザーがより良い結合の方針を選択できるかもしれません。

生成列は、照会のパフォーマンスを向上させるために使用します。 したがって、おそらく、生成列を追加するのは、表を作成したり、 表にデータを読み込んだ後になるでしょう。

以下に、CREATE TABLE ステートメントを使って生成列を定義する方法の例を示します。
   CREATE TABLE t1 (c1 INT,
                    c2 DOUBLE,
                    c3 DOUBLE GENERATED ALWAYS AS (c1 + c2)
                    c4 GENERATED ALWAYS AS
                       (CASE WHEN c1 > c2 THEN 1 ELSE NULL END))
この表を作成した後で、生成列を使用して索引を作成できます。 以下に例を示します。
CREATE INDEX i1 ON t1(c4)
生成列を照会に利用できます。 以下に例を示します。
SELECT COUNT(*) FROM t1 WHERE c1 > c2
これは、以下のように書き換えることができます。
 SELECT COUNT(*) FROM t1 WHERE c4 IS NOT NULL
別の例を以下に示します。
SELECT c1 + c2 FROM t1 WHERE (c1 + c2) * c1 > 100
これは、以下のように書き換えることができます。
SELECT c3 FROM t1 WHERE c3 * c1 > 100