SQL Server 2000以下でストアドプロシージャだと遅くなる場合が

同じSQLでもストアドプロシージャにすると極端に遅くなる場合があります。
ずっと不思議に思っていましたが、パラメータの変数をWHERE条件に使っていた事が原因でした。(特にNULLで初期化)

参考:Google Groups


上記サイトにありますが、例えば

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で)