SQLServerネタ:パフォーマンス改善

まだまだSQLServer中古1年生であるわたしに「遅いがな」と
いう注文が来た。パフォーマンスを上げるべく四苦八苦し、
時には頭から煙を出し、その煙で中毒を起こしながら(ありえません)
がんばってみました。ガッツだぜ! ヽ(~-~(・_・ )ゝ
<内容>
検索条件に見合ったデータをファイル出力する。

<状況>
対象件数:50万件
1レコード長:800Byteくらい Σ(゜д゜)オイオイアバウトジャナ...

<分析>
処理時間の95%がSQL発行による処理であることが判明。
例によって実行プランを駆使してボトルネックを調査。

<改善前>
処理時間:約1時間
特徴  :1クエリ。結合テーブル多数。抽出条件は最終につけてる。
     (途中のサブクエリにはなし)

<改善後>
処理時間:約20分
特徴  :2クエリ。
1クエリ目:抽出条件にそった主キーの一時テーブルを作成。
2クエリ目:上記一時テーブルに沿って出力項目を出す。

大量なボリュームの処理なので複雑化して結合されている
テーブルを整理した。処理のステップとしては「抽出条件処理部分」
と「主処理部分」の2部構成にすることで対応。

これらを踏まえたクエリパフォーマンス改善での今回のポイント
★主キーを揃える。(そのために一時テーブルをフル活用する)
★抽出条件項目+結合項目=Index項目だ。
★レコード形態は主テーブルに揃える。
★無駄な結合を省く。
★サブクエリ内の抽出条件をより多くする。
特にメンドイかったのがレコード形態で主テーブル1レコードに対して
副テーブル10レコード×αだったのをクロス集計しつつ一時テーブル化して
Indexを貼り付けたあたりか。

今回はクエリそのものでの改善を試みたわけだが、後々はSQLServer自体の
改善をやれるようになりたいのぉ...