MS SQL 2005、パラメータスニッフィング、ストアドプロシージャの禁止
最近、私は問題に遭遇しました。QueryAnalyzerで起動されたスクリプトはすぐに機能し、すでに50秒間はストアドプロシージャの形式でした。 リクエストを最適化するために設計されたパラメータスニッフィングの問題であることが判明しました。
:)
ストレージをコンパイルするときに、SQLサーバーは実行計画を作成します。実行計画では、プロシージャの入力パラメーターが特定の種類のものであると想定します。 これは、パラメータスニッフィングと呼ばれます。
パラメーターがわずかに異なることが判明した場合、実行計画は、リクエストの最適な実行にはやや不適切である可能性があります。
問題を解決する最も簡単な方法は、パラメータスニッフィングを無効にすることです。 これは次のように行われます。ローカル変数がプロシージャの本体で作成され、入力パラメーターの値が割り当てられます。
ALTER PROCEDURE [dbo].[REPORT_USERS_BRANCHES]
@branchId INT ,
@branchName NVARCHAR(100) OUTPUT ,
@filterByPaymentActivity VARCHAR (50),
@dateFrom DATETIME,
@dateTo DATETIME
AS
DECLARE @dtFrom DATETIME, @dtTo DATETIME, @filter VARCHAR (50), @bId INT
SET @bId = @branchId
SET @dtFrom = @DateFrom
SET @dtTo = @DateTo
SET @filter = @filterByPaymentActivity
...
* This source code was highlighted with Source Code Highlighter .
また、最適化オプション(OPTION(OPTIMIZE FOR ...))を使用して、プロシージャを作成するときに、毎回プロシージャを再コンパイルする必要があることを示します(WITH RECOMPILE)。
しかし、これらのオプションは私を助けませんでした。
ディシジョンツリーSPメソッドもありますが、すでに完全に怪物です。
追伸:これは単なる松葉杖であり、問題の正しい解決策ではないと確信していますが、プログラマーとしてはこれで十分です。 おそらくDBAはここで最善の方法をアドバイスするでしょうか?
All Articles