ユーザーが単一の閉期間(データウェアハウス表にアーカイブ)またはオープン期間(トランザクションのデータ)からデータを要求するかどうかによって、2つの異なるソースからデータを取得できるストアドプロシージャがあります。テーブル)。SQL IF ELSEパフォーマンスの問題
データウェアハウステーブルへの選択を制限するパラメータを渡すと(ELSE BEGIN ...コードをコメントアウトしない限り、プロシージャは結果を返すのに非常に時間がかかります)コードのELSE部分からのデータはありませんが、プロシージャの速度は低下しています。コードのELSE部分をコメントアウトすると、非常に高速です。
私はOPTION (RECOMPILE)
を試しましたが、パラメータスニッフィングを避けるためにローカル変数を使用していますが、それは役に立ちません。これを回避する方法はありますか?私はELSE文を除外した場合、それは非常に高速に実行
IF @Year <> 0 AND @Period <> 0 AND (SELECT PerClosedTimestamp
FROM Period
WHERE
PerCompanyID = @CompanyID AND
PerYear = @Year AND
PerPeriod = @Period) IS NOT NULL
BEGIN
SELECT
datawhse.column1, datawhse.column2, etc …
FROM
datawhse
END
ELSE
BEGIN
SELECT
trantable.column1, trantable.column2, etc…
FROM
trantable
END
:
IF @Year <> 0
AND @Period <> 0
AND (SELECT PerClosedTimestamp
FROM Period
WHERE PerCompanyID = @CompanyID
AND PerYear = @Year
AND PerPeriod = @Period) IS NOT NULL
BEGIN
SELECT datawhse.column1
,datawhse.column2, etc …
FROM datawhse
END
まだ回答がありませんが、興味深い関連記事(重複しない)です。http://dba.stackexchange.com/questions/9835/using-if-in-t-sql-weakens-or-breaks-execution-plan-キャッシング – scsimon
"PerClosedTimestamp"の前にTOP 1を追加するか、EXISTSを使用するとどうなりますか?条件をIF Year = 0またはPeriod = 0に変更するか、(select ...)がnullの場合は2番目のブロックを実行し、最初の場合はELSEを実行します。また、 "WHERE Year = 0 or Period = 0"(条件を複製して)を2番目のブロックに入れてみてください。 – Anton
遅くて速い実行のクエリプランを見るのはいいでしょう。 –