2009-06-26 2 views
1

おはよう!SQLサーバーでストアドプロシージャをプリコンパイルする方法は?

SQL Serverでストアドプロシージャを事前にコンパイルする方法はありますか?私の要件はこのようになります。実行するよりもコンパイルに時間がかかるストアドプロシージャがいくつかあります。だから私はすべてのストアドプロシージャをプリコンパイルしたい。 dbサーバーが起動して実行されているときにそれらをプリコンパイルするといいでしょう。

これについてのアイデアは非常に役に立ちます!

ありがとうございます。&よろしくお願いします。 Pavan。 CREATE PROCEDUREを

+1

本当に必要のないものをここでは極小に最適化していないと確信していますか?実世界でこのようなものが必要になることは決してありませんでした –

+0

私は数十万のレコードを持つテーブルを持っています。そのため、インデックス付きのビューを有効にして、データにすばやくアクセスできます。これは、そのテーブルの挿入と更新のための欠点です。だから私のストアドプロシージャは、それが最初に実行されるとき、挿入に責任があり、多くの時間がかかります。しかし、後でそれが速くなります。コンパイルや実行計画の作成にSPが時間を費やしていることがわかりました。コンパイル後、レコードを挿入するのに十分速いです。これをプリコンパイルすることで、初めての高速パフォーマンスを実現できますか? – Pavan

+1

あなたは本当に1つのテーブルにインデックス付きのビューを持っていますか?はいの場合は、テーブルにインデックスを作成し、インデックス付きビューを作成しないでください。 –

答えて

2

あなたは再コンパイルを強制することができますが、それはそれは

EXEC SP_RECOMPILE YourProcedureName

more info here...

を実行している次回は力、それを、それが実行されるたびに再コンパイルするまでは発生しませんあなたの手続き名はRECOMPILE .....

この時間を再コンパイルするように強制してください:
EXECあなたOPのコメントに基づいてRECOMPILE

here is a good article on Optimizing SQL Server Stored Procedures to Avoid Recompiles

and another...

EDIT WITH rProcedureName:

なぜあなたは手動で(アプリケーションの外部)、それを実行していない偽のデータを持つ(ように偽のではありません実行計画は悪いですが、Google:SQL Serverパラメータのなりすましとスニッフィング)は、コンパイルを強制することができますし、挿入されたものを削除するためにいくつかのSQLを実行することができます。ユーザーが最初に実行すると、既に実行され、コンパイルされているはずです。

+0

私はsp_Recompileオプションを使ってみました。しかし、spが初めて実行されると、時間がかかり、後で十分速くなります。どのように私は初めての使用のためにそれを改善することができますか? – Pavan

1

SQL Server 2008を使用している場合、既存の、事前にコンパイルされた実行計画の再使用を強制するために、プランガイドを使用することができます。

詳細については、Understanding Plan Guidesを参照し、特定の読み取り「OBJECTプランガイド」

に私はあなたの問題の原因は、あなたのストアドプロシージャ内に実装されているプロセス・ロジックであり、あなたの最初のポイントとしてこれを示唆していることが疑われますパフォーマンスチューニングのレビューの

+0

こんにちは、私はSql Server 2005を使用しており、ストアドプロシージャにはプレーンな挿入文が含まれています。インデックスビューはテーブルに存在します。だから実行計画を準備することは時間を消費することです。どのように我々はこれを先に準備することができ、実行の準備ができているすべてのアイデア? – Pavan

+1

こんにちは、自分の環境を理解するのを助けるために、インデックスを基になるテーブルに直接インデックスを追加するのではなく、なぜインデックス付きビューを使用していますか?いくつのインデックスビューを使用していますか?テーブルにはいくつのインデックスがありますか? –

+1

これは本当に問題のようですね。インデックス付きビューは、単なる別のインデックスとして誤解されることがよくあります。しかし、彼らは実際には、ビューのphyiscal表現を作成します。インデックス付きビューの一部であるテーブルに挿入すると、問題が発生する可能性があります。 これが通常のインポートルーチンの一部である場合、インポートする前にインデックスを無効にします。インポート後、再度有効にします。 –

0

ストアドプロシージャは、作成されて最初に実行されるときにのみコンパイルする必要があります(クエリプランを作成する場合のみ)。

WITH RECOMPILEをたくさん使用している場合は、停止する必要があります。異なるパラメータが異なるクエリプランでより効率的に機能するため、クエリプランの再計算を強制的に実行する場合(パフォーマンス面で問題がある場合)、異なるクエリプランに対して異なるSPを作成することを検討する必要があります。親 "SPがどちらを呼び出すかを決定する。しかし、それは苦痛のない運動ではありません。

テーブルが本当に百万行カテゴリにある場合は、索引付けと統計情報を最新の状態に保ち、静かな時間に定期的に再コンパイルして、問合せ計画を効率的に保ちます。何千万か何百万行になったら、重複の苦痛を経験するケースがあるかもしれません。

5

"SET FMTONLY ON"を使用して、各ストアドプロシージャを実行するスクリプトを作成します。

プロシージャはコンパイルされますが、実行中にDBに永続的な変更は行われません。テンポラリテーブルを使用するプロシージャ(#table構文)では使用できません。

これはMicrosoftがVisual Studioでストアドプロシージャの出力結果を決定する方法です。

+1

いいえ、そうではありません。 'SET FMTONLY ON'を使用します。 –

+1

" SET FMTONLY ON "ソリューションを使用するように変更されました。素晴らしいアイデア、コメントと-1のおかげで。 –

1

データに影響を与えずにSPを1回だけ実行できますか?もしそうなら、おそらくサーバーの起動時にこのSPを起動する方法を見つけることができます。

-1

最近、重要な編集時間はめったにありません。このコードをプログラムの先頭に挿入し、コンパイルに要する時間を少しだけ見てください。

SET STATISTICS TIME ON 
GO 

あなたは、コンパイル時間は通常、実行時間がミリ秒の数十、数百、あるいは数千であるのに対し、と気には小さすぎることを意味する、0msで与えられています。

+2

あなたが正しいかどうかにかかわらず、OPが尋ねた特定の質問に答えるつもりなら、それは答えではなくコメントでなければなりません。 –

関連する問題