効率的な SELECT ステートメント

SQL は柔軟な高水準言語なので、 複数の異なる SELECT ステートメントを作成して、 同じデータを検索することができます。 しかし、ステートメントの形式が異なる場合や、最適化のクラスが異なる場合は、パフォーマンスが変化する可能性があります。

効率的な SELECT ステートメントを作成するための、以下の指針を考慮してください。
  • 必要な列だけを指定します。 1 つのアスタリスク (*) を使ってすべての列を指定すると、不必要な処理が実行されます。
  • 応答セットを必要な行のみに制限する述部を使用します。
  • 必要な行数が、返される可能性がある行数の合計よりかなり少ない場合には、OPTIMIZE FOR 節を指定します。 この節は、アクセス・プランの選択と通信バッファーでブロック化される行数の両方に影響します。
  • 行ブロッキングを利用してパフォーマンスを改善するには、FOR READ ONLY または FOR FETCH ONLY 節を指定します。 検索された行には排他ロックがかけられないので、並行性も向上します。 追加の照会の再書き込みも行えます。 BLOCKING ALL BIND オプションと一緒にこれらの節を指定すると、フェデレーテッド・データベース・システム内のニックネームに対して実行される照会のパフォーマンスが同様に向上する場合があります。
  • 位置指定 UPDATE で使用されるカーソルについては、FOR UPDATE OF 節を指定して、データベース・マネージャーが初めにより適切なロック・レベルを選択したり、発生する可能性のあるデッドロックを回避したりできるようにします。 FOR UPDATE カーソルは、行ブロッキングの利点は生かせません。
  • 検索条件付き UPDATE で使用されるカーソルについては、FOR READ ONLY および USE AND KEEP UPDATE LOCKS 節を指定し、影響を受ける行を強制的に U ロックすることにより、デッドロックを回避しながらも、行ブロッキングを行えます。
  • 可能な限り、数値データ・タイプの変換はしないようにします。 値を比較するときは、同じデータ・タイプの項目を使うようにします。 変換が必要な場合、精度の低さのために正確でなくなったり、ランタイム変換のためにパフォーマンスが低下したりする可能性があります。
    可能なら、以下のデータ・タイプを使用してください。
    • 短い列では、VARCHAR 型ではなく、CHAR 型
    • 浮動小数点数や 10 進数、または DECFLOAT ではなく、整数
    • 10 進数ではなく、DECFLOAT
    • 文字列型ではなく、日時
    • 文字列型ではなく、数値
  • ソート操作が発生する可能性を小さくするには、DISTINCT または ORDER BY などの節を、必要でなければ省略します。
  • 表に行があるかどうか調べるときには、単一の行を選択します。 カーソルをオープンして 1 つの行を取り出すか、単一行の SELECT INTO 操作を実行します。 複数の行が検出される場合は、SQLCODE -811 のエラーを必ず調べてください。
    表が非常に小さいものであると分かっているのでない限り、 以下のステートメントを使用して非ゼロ値を検査することはしないでください。
       select count(*) from <table-name>
    大規模な表の場合、 すべての行のカウントを行うとパフォーマンスに影響します。
  • 更新活動が低調で表が非常に大きい場合には、述部として頻繁に使用する列に索引を定義します。
  • 複数の述部に同じ列が存在する場合には、IN リストを使用することを考慮します。 大きい IN リストをホスト変数と共に使用すると、ホスト変数のサブセットのループインでパフォーマンスが向上する可能性があります。
複数の表にアクセスする SELECT ステートメントには、 特に以下のことが適用されます。
  • 表を結合するには、結合述部を使用します。 結合述部 とは、1 つの結合において異なる表の 2 つの列を比較することです。
  • 結合述部内で列に対して索引を定義し、それによって、その結合をさらに効率的に処理できるようにします。 索引は、複数の表にアクセスする SELECT ステートメントを含む UPDATE ステートメントおよび DELETE ステートメントにも、効果があります。
  • 可能なら、結合述部と一緒に OR 節または式を使用しないようにします。
  • パーティション・データベース環境では、結合される表が結合列上でパーティション化されるようにすることを推奨します。