2011-02-10 29 views
20

SQL Serverチューニングアドバイザを使用してEntity Frameworkクエリに基づいて推奨事項を作成するにはどうすればよいですか? Entity Frameworkはクエリを実行する代わりにsp_executesql 'query'を使用し、Tuning Advisorはこれらのクエリを認識しません。私は、手動でクエリテキストを得ることができますが、これは非常に単純なscenariousのために動作します。私はどのように自動でそれを行うのですか?Entity FrameworkとSQL Serverチューニングアドバイザ

UPDATE

私はテーブルにプロファイリング情報を保存し、「sp_executesqlを」を取り除くだけでクエリテキストを保持し、チューニング・アドバイザを実行するには、この新しいデータを使用するいくつかのアプリケーションを実行する場合には役立つだろうか?

+0

私はこの質問が好きです。現在のSQLジェネレータはあまり良くないので、MS Connectでも尋ねられるはずです。これは多くの問題の1つに過ぎません。 –

+1

私はまだこれに問題があります。私は以下のすべての提案を試しました。被験者についての良い情報を見つけるのが難しい。 – eatfrog

答えて

0

SQLプロファイラを使用して、クエリのセッション全体を取得します。作業が完了したら、プロファイラ結果を保存してSQL Serverチューニングアドバイザを使用して全体を実行できます。私の経験では、個々のクエリに基づいたチューニングよりもずっと良い結果が得られ、プロファイラを使用して実際のアプリケーションの使用状況からクエリを取得できるので、多くの点でより簡単で現実的です。

EDIT:あなたは約求めている特定の問題にもっと注意をもたらすため

感謝。チューニング・アドバイザーがsp_executesqlを理解していないと言っていることはわかりませんでしたが、それは単に真実ではないからです。 sp_executesqlを使用して、必要なだけ多くのクエリーを実行し、それらをプロファイルで取得し、Tuning Advisorを使用してそのプロファイルを実行すると、推奨が得られます。

私はMS SQL Server 2008 R2でやりました。私はインデックスを持たないテーブルを作成し、sp_executesqlで一連のクエリを実行し、SQLプロファイラでそれらを取得し、Tuning Advisorでトレースを実行しました。チューニング・アドバイザは、sp_executesqlに埋め込まれた問合せに対して適切な推奨事項を示しました。

データベースエンジンチューニングアドバイザの正確なバージョンは、Microsoft SQL Server 2008 R2(RTM) - 10.50.1617.0(X64)に対して実行されています。10.50.1600.1は2011年4月22日19:23:43です。 (64ビット)Windows NT 6.1(ビルド7601:サービスパック1)。

+0

私はあなたがその質問を理解するとは思わない。問題は、チューニング・アドバイザーが理解できないsp_executesqlコマンドをEFが発行することです。 – Craig

+0

@Craig、そうです、私は理解しませんでしたが、それは前提が真実ではないからです。 Tuning Advisorは 'sp_executesql'を理解していないので何をすべきか質問していますが、チューニング・アドバイザは実際に上記の手順で' sp_executesql'を理解しています。 –

+0

SQL Server Profilerの出力を分析していれば、バッチだけでなく個々のステートメントをログに記録しておけば、適切な出力を得ることができます。 –

5

これは問題のようです。チューニングテンプレートからSQLプロファイラを使用してトレースを作成した場合、正しいイベントは含まれません。データベースエンジンチューニングアドバイザは、完了したバッチのバッチからのステートメントsp_executsqlを認識しません。 「S008」のカテゴリーIDを持つ「イベントはどのテーブルも参照していません」というチューニング・ログに報告されます。

トレースをキャプチャするときは、「SQL:StmtCompleted」イベントをTSQLセクションの下に追加する必要があります。

+1

私はこの解決法がうまくいくのを見いださなかった。 –

2

ジェフ・ウォーカーが正しい方向に私を指摘 - SQLのイベントの選択]で(私は確信しているが、彼は完全な答えを知っていたし、ちょうど完全にそれを説明していなかった)

を彼の答えは不完全でしたServerプロファイラ:

は、RPCのログ削除:ストアドプロシージャの下で完了する - これはすべてのイベントに展開し、SPを追加するEntity Frameworkの

で悪いんアイテムです:取得するために、ストアドプロシージャの下StmtCompletedのクエリintトレース。

私のために働くようです。

Microsoft Entity Frameworkのユーザー(およびプロファイラーのユーザー)これは実際には不景気です。それは以前から働いていました。

6

このトピックは少し寒いです。しかし、私は同じ問題を持つとよりよい解決策見つかったので、:

が撮影したイベントを変更すると、それを行うための一つの方法ですが、SQLサーバーのチューニングアドバイザによって必要なすべてを記録し、「テンプレート」、すでにそこにあります。

テンプレート「チューニング」を選択すると、Dougが引用したイベントキャプチャも効果的に削除され、追加されます。

あなたが対応するテンプレート(私はそれを作成していない、それはすでにそこにあった)を選択し、「新しいトレース」ウィンドウで、このテンプレートを有効にするには、テンプレートhere

についての詳細を見つけることができます。 New trace properties

をあなたはそれをやったら

、あなたはイベントの選択を確認することができ、あなたはすでに、何が必要とされています: Trace event selection

私はadditionaly、RPCCompletedを無効にして私は、ストアドプロシージャをしましたしないため

私はそれが一部の人々に役立つことを望みます;)

関連する問題