Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » データベースの作成 » データベース・オブジェクトの使用

 

計算カラムの使用

計算カラムとは、同一ロー内にある「従属カラム」と呼ばれる他のカラムの値を参照する式を値としているカラムのことです。計算カラムは、1 つまたは複数の従属カラムの値を含む複雑な式をインデックス化するような場合に特に便利です。データベース・サーバは、計算カラムの COMPUTE 式と一致する式が認識できる場合は、常に計算カラムを使用します。これには SELECT リストや述部が含まれます。ただし、クエリ式に CURRENT TIMESTAMP などの特別値が含まれる場合は、この一致は起こりません。一致が起こらない特別値のリストについては、特別値を参照してください。

クエリの最適化中、SQL Anywhere オプティマイザは、複雑な式を含む述部を、単純に計算カラムの定義を参照する述部へ自動的に変換しようとします。たとえば、クエリに製品出荷に関する一覧情報で構成されたテーブルを要求したとします。

CREATE TABLE Shipments(
   ShipmentID INTEGER NOT NULL PRIMARY KEY,
   ShipmentDate TIMESTAMP,
   ProductCode CHAR(20) NOT NULL,
   Quantity INTEGER NOT NULL,
   TotalPrice DECIMAL(10,2) NOT NULL
);

特に、クエリは平均コストが 2 ~ 4 ドルである製品出荷を返します。クエリは、次のように記述できます。

SELECT *
   FROM Shipments
   WHERE ( TotalPrice / Quantity ) BETWEEN 2.00 AND 4.00;

しかし、上記のクエリで、WHERE 句の述部は単一ベースのカラムを参照しないため、検索引数が使用できません。クエリでの述部の使用を参照してください。Shipments テーブルのサイズが比較的大きい場合、インデックス検索の方が逐次スキャンより適している場合があります。インデックス検索を向上させるには、次のように Shipments テーブルに AverageCost という名前の計算カラムを作成してから、そのカラムにインデックスを作成します。

ALTER TABLE Shipments
   ADD AverageCost DECIMAL(21,13)
   COMPUTE( TotalPrice / Quantity );
 CREATE INDEX IDX_average_cost
   ON Shipments( AverageCost ASC );

計算カラムのタイプを選択することは重要です。クエリ内の式のデータ型が計算カラムのデータ型と正確に一致した場合、SQL Anywhere のオプティマイザは複雑な式のみを計算カラムに置き換えます。式のタイプを判別するために、使用可能な SQL 文内の式のタイプを返す EXPRTYPE 組み込み関数を使用できます。

SELECT EXPRTYPE(
 'SELECT ( TotalPrice/Quantity ) AS X FROM Shipments', 1 )
   FROM DUMMY;

Shipments テーブルに対して、上記のクエリは decimal(21,13) を返します。最適化中に、SQL Anywhere オプティマイザは上記のクエリを次のように書き換えます。

SELECT *
   FROM Shipments
   WHERE AverageCost
   BETWEEN 2.00 AND 4.00;

この場合 WHERE 句内の述部は検索引数可能なものとなり、オプティマイザは、新しい IDX_average_cost インデックスを使用して、クエリのアクセス・プラン用のインデックス・スキャンを選択できます。


計算カラム式の変更
計算カラムの挿入と更新
計算カラムの再計算
データベース内またはデータベース間でのテーブルまたはカラムのコピー