無理をして一つの巨大なSQLを組み立てるより、分割して効率よく処理した方がデータ量による処理時間の増加率が把握しやすい。下記のサイトで説明されていることは、もっともだと思う。
http://www.sqlpassj.org/bbs/ml_disp.aspx?forum_id=4¤t_page=1&disp_mode=4&detail_mode=1&message_id=16173
私のSQL Server(のクエリ)の師匠からは
・クエリを考えるときには「データの束」を意識する
・Notは極力使わない
・カーソルも極力使わない
・Or In も極力使わない
・ネストの深いサブクエリやUnionを使うぐらいなら一時テーブルを使え
というようなアドバイスを受けている
http://www.sqlpassj.org/bbs/ml_disp.aspx?forum_id=4¤t_page=1&disp_mode=4&detail_mode=1&message_id=16176
ネストの深いサブクエリ等ではレコードを生成する都度サブクエリを実行する?
ため、最悪「サブクエリ1回の実行時間×レコード数×テーブル参照時間」が
必要であるのに対して、一時テーブルを作成するケースではテーブルを参照
するだけなので「サブクエリ1回の実行時間+レコード数×テーブル参照時間」
となり、生成されるレコード数が多いほど顕著に差が出た様子です。
20万レコード程度のテーブルから結果を集計して抽出するのにあたり、
1分近くかかっていたものが一時テーブルの利用で一気に1秒以下まで
短縮できた実績があります。
http://www.sqlpassj.org/bbs/ml_disp.aspx?forum_id=4¤t_page=1&disp_mode=4&detail_mode=1&message_id=16190
・結合する前にフィルタをかける。
・フィルタは絞り込み効果の高い順にかける。