仮想列・生成列・計算列の使い道を考えてみた

仮想列とは、列単位で定義できるビューのようなもので、ほとんどのデータベースソフトで標準搭載されている機能。

しかし、どうやっても使い道が見つからないため、この度少し時間を使って考えてみたのでまとめる。

仮想列・生成列・計算列とは

テーブルを定義する際に通常のカラムに加えて、動的に変化させるカラムを用意できる機能。

具体的には以下のようなイメージ。

CREATE TABLE sales (
    sale numeric,
    quantity numeric,
    total numeric GENERATED ALWAYS AS (sale * quantity) STORED
);

salesテーブルにはsaleとquantityカラムが存在し、ここに登録された値によって動的にtotalカラムの値が変動する仕組み。

totalカラムにはデータは設定できず、あらかじめ設定された値にしかならない。

仮想列のメリット

物理的な容量を取らずにカラムを追加できる

製品にもよるが、物理的な容量を取らないため、データベースの容量を取得するのにも申請が必要な企業にとってはメリットになるんじゃないかなと。

永続化するタイプの仮想列の場合は対象外。

例えば、都道府県とか、コードに対応する文字列が決まっており、増えるようなことがない値の場合はCASEで定義しておけば、1列ぶんの容量を減らしながら都道府県名が設定できる。

インデックスを設定できる

ORACLE限定かもしれないが、インデックスを設定できるため、WHERE句に記載する場合はビューなどに比べるとお得。

仮想列のデメリット

管理が冗長になる

テーブル定義の時点で処理が書けてしまうと、テーブルに対してのインサート処理、ビュー、プログラムの業務コードに加えて、処理を確認する箇所が増えてしまうため、原因調査をするような時に非常に時間がかかる。

計算結果を直接登録するのに比べて遅くなる

永続化するタイプはのぞいて、それ以外の場合は毎回参照するたびにクエリを発行するため、多少なりとも遅くなる。よく使う項目なのであれば特別な理由がない限り直接登録した方が無難。

INSERT文が書きにくくなる

以下参照。

様々な制限がテーブルに課される

データベースソフトによって変わるが、テーブル自体に制限が課されるのが厳しい。

まとめ

どんなに考えても有効的な使い方を思いつけなかった。

仮想列を用意しても、作業を依頼するときに仮想列を知らない人の方が多いため、トラブルの温床となる。

引き継ぎのことを考えても使わない方が無難。

 

 

 

おすすめの記事