一時表に気を付けて
あなたの記事 Dynamic Lists in Static SQL Queries についてお便りしています。最近の NEUSG 会議で、IBM の Tom McKinley は一時表にはオプティマイザーの履歴がないため、特に一時表の照会チェーンを使わないよう忠告してくれました。私は動的 SQL が気に入っています。私ならそのままにしておいたでしょう。
--Lynne
名言を聞くことができるので、Lynne からの便りはいつも楽しみです。Lynne は、この 8 月発行版で対処するつもりだった良いポイントを挙げてくれました。
IBM の DB2 for i Center of Excellence での Tom McKinley の同僚の 1 人の Kent Milligan は、しばらく前に一時表の乱用がかなりあると言っていました。Kent が言うには、できるだけビューと共通表式の使用を勧めているそうです。
これは、Lynne が言ったように、特に照会のチェーンに関する限り、素晴らしいアドバイスです。例えば次のようになります。
照会 1 はデータベース表を読み取り、一時表 1 を構築します。
照会 2 はデータベース表を読み取り、一時表 2 を構築します。
照会 3 は一時表 1 と 2 を結合し、最終的な結果セットを取得します。
確かに 3 つの SQL 照会を作成し、これら 3 つの Query for i 照会を模倣できますが、できると最適は同じではありません。
もっとシンプルな照会チェーンを使って、いくつか好ましい代替手段を図でお見せしようと思います。
表 QIWS/QCUSTCDT には、顧客ごとに行が 1 つあります。2 つの列は、未払い残高 (BALDUE) と貸付残高 (CDTDUE) です。BALDUE は顧客が我々に支払うべき金額、CDTDUE は我々が顧客に支払うべき金額であると考えると、顧客が我々に支払うべき総額は (BALDUE 引く CDTDUE) の合計です。
照会 1 は、BALDUE 引く CDTDUE の合計額を 1 行の一時表に計算し、これを TEMP1 と呼びます。BALANCE01 列には、値 5,761.25 が入っています。
照会 2 は、cross join (カルテシアン積) QIWS/QCUSTCDT および TEMP1 を使って、各顧客の負債の分担額を見つけます。同等の SQL ステートメントは以下のとおりです。
レポートは以下のようになります。
結果セットは正しいのですが、それを導き出した方法は最適な方法からは程遠いものです。
ある代替方法では、共通表式を使って合計額を計算します。
導出表を使うという方法もあります。
3 つ目の方法では、ビューを使って合計額を計算します。
当然、ビューは一度しか作成されません。クエリーを実行するたびにビューを再作成する必要はありません。表を照会するのと同じように、ビューを照会します。
良いレッスンになりました。一時表が必要なら、是非とも作成してください。私の経験では、ほとんどの場合一時表は必要ありません。私は仕事では、多数の共通表式と導出表を使います。