2011-12-07 26 views
2

SQLクエリでパフォーマンスの問題があります。 これは私がパラメータでのSQL Serverパフォーマンスの問題

@totalCount int 

SELECT @totalCount = COUNT(DISTINCT pro.product_id) 
FROM product AS pro 
INNER JOIN product_to_category AS proCat ON pro.product_id = proCat.product_id 
INNER JOIN product_to_vendor proVen ON pro.product_id = proVen.product_id 
WHERE pro.site_id = 28 
AND pro.product_type <> 3 
print @totalCount 

を次のようにパラメータを削除して、再度クエリを実行すると、

、それはわずか2秒で..それを実行するために6秒かかるである私のクエリ

declare @siteId int,  
@totalCount int 

SELECT @totalCount = COUNT(DISTINCT pro.product_id) 
    FROM product AS pro 
    INNER JOIN product_to_category AS proCat ON pro.product_id = proCat.product_id 
    INNER JOIN product_to_vendor proVen ON pro.product_id = proVen.product_id 
WHERE pro.site_id = @siteId 
    AND pro.product_type <> 3 
print @totalCount 

です。

このようなクエリのパフォーマンスを向上させる方法はありますか? なぜパラメータに値を割り当てるのに時間がかかりますか? コメント....

+1

テーブルにインデックスを作成していますか? – Taryn

+0

@ Tharaka、ハードコードされたバージョンを実行した直後*クエリのパラメータ化されたバージョンを再実行しようとしましたか?もしそうなら、どれくらいかかりましたか? –

+0

product.site_id intですか? – gbn

答えて

2

これは変数ではありません。それはコンパイル時にわからないよう

SQL Serverは、それが含まれています値は28

が、それは後のステートメントを再コンパイルするために取得するには、クエリの最後にOPTION (RECOMPILE)を追加していることを変数の値を嗅ぐしません。変数の値が割り当てられており、より適切な実行計画が生成されるはずです。

+0

私はOPTION(RECOMPILE)を試しました。サブストアドプロシージャはネストされたストアドプロシージャではありません。他のソリューションはありますか? – Tharaka

+0

これをクエリの最後に追加します。 '... WHERE pro.site_id = @siteId AND pro.product_type <> 3 OPTION(RECOMPILE) ' –

関連する問題