ストアドプロシージャの更新は、ユーザーがシステムを積極的に使用しているときにできることだといつも思っていました。
しかし、私は現在、ストアドプロシージャの更新をテストしており、sprocへの長時間実行中の呼び出しが実行されている間に(呼び出しから4分以上)、sprocを更新しました。(別のウィンドウで別のクエリプランを試すことを計画していました。)
私が長期的なものに戻ったとき、私はこのエラーがありました:
The definition of object 'MySprocName' has changed since it was compiled.
このエラーは、sprocの定義が更新されると、アクティブに実行されているsprocが失敗することを示しているようです。(sprocが実行を開始すると、定義への変更にもかかわらず、残りの実行に対してその計画を使用すると思いました。)
これは本当ですか?sprocの定義を更新するためにダウンタイムが必要ですか?
3
ストアドプロシージャ呼び出しは、より大きなトランザクションの一部ですか?何かのスキーマロックを取り除くコードはありますか?理論的には、変更はブロックされるだけです。プロシージャの機能とその一部について詳しく説明できますか?
—
アーロンバートランド
@aaron Bertrand-かなり無害なsprocです。それはいくつかの選択トップコールがあります。ロックなどのようなものはありません。重要なのは、パラメーターに基づいたいくつかの「if」ステートメントがあることです。実際のクエリの実行は、パラメータに基づいて少し異なります。.netサービスから呼び出されます。
—
ヴァッカーノ
「かなり良性」の手順を実行するのに4分はかかりません。その間ずっと何をしているのですか?
—
アーロンバートランド
alter proc <proc Name>を試しました
—
MarmiK
WITH RECOMPILE
か?これは、各実行後に再コンパイルするようにプロシージャを設定するプロシージャレベルのオプションです。つまり、プランは常に再コンパイルされるため、キャッシュされたプランが再利用されることはありません。
dba.stackexchange.com/questions/154939/…この質問を見ましたか?
—
k010mb0