SQL Server 2000以下でストアドプロシージャだと遅くなる場合が
同じSQLでもストアドプロシージャにすると極端に遅くなる場合があります。
ずっと不思議に思っていましたが、パラメータの変数をWHERE条件に使っていた事が原因でした。(特にNULLで初期化)
上記サイトにありますが、例えば
CREATE PROC proc1 @p1 int AS SELECT * FROM table1 WHERE c1 = @p1 GO
のようなストアドプロシージャは要注意です。
特に
CREATE PROC proc1 @Today DATETIME = NULL AS SET @Today = /* 何かの値 */ SELECT * FROM table1 WHERE c1 = @Today GO
のようにNULLで初期化しているのは危ないです。
あまりきちんと読めていませんが、そういうパラメータにはどんな値が入ってくるか全く特定できないので、コンパイルでプランが不幸なことになる場合があるということですね。
実際のところ、数十分かかっていたストアドプロシージャに対し、初期化NULLを回避しただけでかなり早く(数十秒)になりました。(件数〇千万件のテーブルに対するselectで)