showplanコマンドの使用
組込みshowplan
コマンドを使用すると、TimesTenで問合せの処理に使用される問合せオプティマイザ計画が表示されます。
また、ttIsql
には、この問合せオプティマイザ計画を変更するための組込み問合せオプティマイザ・ヒント・コマンドが用意されています。showplan
コマンドと、次に示すttIsql
コマンドを組み合せて使用すると、最適な実行計画を設計できます。
-
optprofile
- 現行のオプティマイザ・ヒントの設定および結合順序を表示します。 -
setjoinorder
- 結合順序を設定します。 -
setuseindex
- 索引ヒントを設定します。 -
tryhash
- ハッシュ索引の使用を有効または無効にします。 -
trymergejoin
: マージ結合を有効または無効にします。 -
trynestedloopjoin
- ネステッド・ループ結合を有効または無効にします。 -
tryserial
- シリアル・スキャンを有効または無効にします。 -
trytmphash
- 一時ハッシュ索引の使用を有効または無効にします。 -
trytmptable
- 中間結果表の使用を有効または無効にします。 -
trytmprange
: 一時範囲索引の使用を有効または無効にします。 -
tryrange
: 範囲索引の使用を有効または無効にします。 -
tryrowid
- ROWIDスキャンの使用を有効または無効にします。 -
trytbllocks
: 表ロックの使用を有効または無効にします。 -
unsetjoinorder
- 結合順序を消去します。 -
unsetuseindex
- 索引ヒントを消去します。
showplan
コマンドおよび問合せオプティマイザ・ヒント・コマンドを使用する場合は、自動コミット機能が無効である必要があります。autocommit
を無効にするには、ttIsql
のautocommit
コマンドを使用します。
この例では、これらのコマンドを使用して問合せオプティマイザの実行計画を変更する方法を示します。
Command>CREATE TABLE T1 (A NUMBER); Table created. Command>CREATE TABLE T2 (B NUMBER); Table created. Command>CREATE TABLE T3 (C NUMBER); Table created. Command>INSERT INTO T1 VALUES (3); 1 row inserted. Command>INSERT INTO T2 VALUES (3); 1 row inserted. Command>INSERT INTO T3 VALUES (3); 1 row inserted. Command>INSERT INTO T1 VALUES (4); 1 row inserted. Command>INSERT INTO T2 VALUES (5); 1 row inserted. Command>INSERT INTO T3 VALUES (6); 1 row inserted. Command>autocommit 0; Command>showplan; Command>SELECT * FROM T1, T2, T3 WHERE A=B AND B=C; Query Optimizer Plan: STEP: 1 LEVEL: 3 OPERATION: TblLkSerialScan TBLNAME: T2 IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 2 LEVEL: 3 OPERATION: TblLkSerialScan TBLNAME: T3 IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: T2.B = T3.C STEP: 3 LEVEL: 2 OPERATION: NestedLoop TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 4 LEVEL: 2 OPERATION: TblLkSerialScan TBLNAME: T1 IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: T1.A = T2.B AND T1.A = T2.B STEP: 5 LEVEL: 1 OPERATION: NestedLoop TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> < 3, 3, 3 > 1 row found. Command>trytbllocks 0; Command>tryserial 0; Command>SELECT * FROM T1, T2, T3 WHERE A=B AND B=C; Query Optimizer Plan: STEP: 1 LEVEL: 3 OPERATION: TmpRangeScan TBLNAME: T2 IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 2 LEVEL: 3 OPERATION: RowLkSerialScan TBLNAME: T3 IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: T2.B = T3.C STEP: 3 LEVEL: 2 OPERATION: NestedLoop TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 4 LEVEL: 2 OPERATION: RowLkSerialScan TBLNAME: T1 IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: T1.A = T2.B AND T1.A = T2.B STEP: 5 LEVEL: 1 OPERATION: NestedLoop TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> < 3, 3, 3 > 1 row found.
この例では、Select
問合せに対して問合せオプティマイザの計画が表示されています。1つ目のバージョンの問合せでは、問合せオプティマイザのデフォルトの実行計画が使用されています。ただし、2つ目のバージョンでは、trytbllocks
およびtryserial
のttIsql
組込みヒント・コマンドを使用して問合せオプティマイザの計画が変更されています。2つ目のバージョンの問合せでは、シリアル・スキャンおよびネステッド・ループ結合ではなく、一時索引スキャン、シリアル・スキャンおよびネステッド・ループが使用されています。2つ目のバージョンでは、表ロックのオプティマイザ・ヒントが無効になっているため、表ロックのかわりに行ロックが使用されます。
このように、showplan
コマンドをttIsql
の組込み問合せオプティマイザ・ヒント・コマンドと組み合せて使用すると、アプリケーション要件を満たすために使用する実行計画を迅速に決定できます。問合せオプティマイザは、統計に基づいて最適な問合せ計画を生成します。不適切な問合せパフォーマンスを確認する場合は、オプティマイザ・ヒントを使用して問合せ計画を変更する必要があります。