計算カラムとは、同一ロー内にある「従属カラム」と呼ばれる他のカラムの値を参照する式を値としているカラムのことです。計算カラムは、1 つまたは複数の従属カラムの値を含む複雑な式をインデックス化するような場合に特に便利です。データベースサーバーは、計算カラムの COMPUTE 式と一致する式が認識できる場合は、常に計算カラムを使用します。これには SELECT リストや述部が含まれます。ただし、クエリ式に CURRENT TIMESTAMP などの特別値が含まれる場合は、この一致は起こりません。
TIMESTAMP WITH TIME ZONE カラムは、計算カラムとして使用しないでください。time_zone_adjustment オプションの値は、ロケーションと日付に基づいて、接続ごとに異なる値となる場合があるため、これらの値が計算されると、不正な結果や予期しない動作が発生することがあります。
クエリの最適化中、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 インデックスを使用して、クエリのアクセスプラン用のインデックススキャンを選択できます。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |