17.05 - 例: 単純な行圧縮された結合インデックスの作成および使用 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 構文規則および例

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
Release Date
2021年1月
Content Type
プログラミング リファレンス
Publication ID
B035-1144-175K-JPN
Language
日本語 (日本)

次の例では、以下のcustomerテーブルとordersテーブルに基づいて単純な行圧縮結合インデックスを作成します。

     CREATE TABLE customer (
       c_custkey    INTEGER,
       c_name       CHARACTER(26) not null,
       c_address    VARCHAR(41),
       c_nationkey  INTEGER,
       c_phone      CHARACTER(16),
       c_acctbal    DECIMAL(13,2),
       c_mktsegment CHARACTER(21),
       c_comment    VARCHAR(127))
     PRIMARY INDEX( c_custkey );
     CREATE TABLE orders (
       o_orderkey      INTEGER,
       o_date          DATE FORMAT 'yyyy-mm-dd',
       o_status        CHARACTER(1),       
       o_custkey       INTEGER,
       o_totalprice    DECIMAL(13,2),
       o_orderpriority CHARACTER(21),
       o_clerk         CHARACTER(16),
       o_shippriority  INTEGER,
       o_comment       VARCHAR(79))
     UNIQUE PRIMARY INDEX(o_orderkey);

次の結合問合わせをcustomerordersに対して頻繁に実行するとします。

     SELECT o_custkey, c_name, o_status, o_date, o_comment
     FROM orders, customer 
     WHERE o_custkey = c_custkey;

結合インデックスを使用しない場合、この問合わせの一般的な実行計画は、ordersテーブルをスプール ファイルに再配置し、スプールをo_custkeyでソートしてから、スプール ファイルとcustomerテーブルとの間でマージ結合を実行するというステップになります。

ord_cust_idxのような結合インデックスがcustomerordersに対して定義されていれば、その場合の実行計画は結合インデックスをスキャンするだけです。

結合インデックス定義内の固定列セットはo_custkeyc_name(オレンジで強調表示された対応する結果行)で、結合インデックス定義内の反復列セットはo_statuso_date、およびo_comment(青で強調表示された対応する結果行)です。

     CREATE JOIN INDEX ord_cust_idx AS
       SELECT (o_custkey,  c_name 
), (
 o_status, o_date, o_comment 
) 
       FROM orders, customer 
       WHERE o_custkey = c_custkey;

この定義によれば、ord_cust_idxは行圧縮の結合インデックスであり、o_custkeyc_nameが固定列セットで、o_statuso_date、およびo_commentが反復列セットです。

基本テーブルのcustomerordersに次のデータが含まれているとします。

customer    
c_custkey c_name c_address
100 Louis Rancho Bernardo
101 Pekka Helsinki
102 Felipe San Juan
orders        
o_orderkey o_date o_status o_custkey o_comment
5000 2011-10-01 S 102 rush order
5001 2011-10-01 S 100 big order
5002 2011-10-03 D 102 delayed
5003 2011-10-05 U ? unknown customer
5004 2011-10-05 S 100 credit
5005 2011-10-08 P 101 discount

行圧縮結合インデックスord_cust_idx内の対応する行は、次のとおりです。

ord_cust_idx  
固定列 反復列
100  Louis S  2011-10-01  big order  2011-10-05  credit
101  Pekka P  2011-10-08  discount
102  Felipe S  2011-10-03  rush order  D  2011-10-03  delayed

固定セットの列がord_cust_idxの最初の列に入っており、反復セットの列がord_cust_idxの2番目の列に入っていることに注意してください。これは、結合インデックス定義に定義されているとおりです。

内部結合によって生成された結合の結果には、一致しない行が保存されないという短所があります。この例の最初の部分で、order(注文)5003に関する情報がord_cust_idxに格納されないため、インデックスを使用して解決できる問合わせのタイプが限られています。結合インデックスをできるだけ多くの問合わせに利用できるようにするには、可能な限り外部結合を使用して結合インデックスを定義するようにします。そうすることで、インデックスの生成に使用したときよりも少ない結合条件でも、結合条件は十分に問合わせを実行できます。

ord_cust_idxの定義を変更して、次のCREATE JOIN INDEXリクエストのような外部結合を使用することにしたとします。

     CREATE JOIN INDEX ord_cust_idx AS
     SELECT (o_custkey, c_name), (o_status, o_date, o_comment)
     FROM orders LEFT OUTER JOIN customer ON o_custkey = c_custkey;

その結果、ord_cust_idxの行は次のようになります。

ord_cust_idx  
固定列 反復列
100 Louis S  2011-10-01  big order  S  2011-10-05  credit
101 Pekka P  2011-10-08  discount
102 Felipe S  2011-10-03  rush order  D  2011-10-03  delayed
?   ? U  2011-10-05  unknown customer

左外部結合を使用してord_cust_idxを定義し直すことにより、次の問合わせも結合インデックスのみを使用して解決できます。

     SELECT o_status, o_date, o_comment
     FROM orders;