Database Engine Tuning Advisorを使用してデータベースを最適化しようとしていますが、直面している問題は、SQL Profilerトレースに、sp_executesql
-を使用して実行された大量のクエリが表示され、Advisorがそれらを処理できないことです。これらのクエリは、私が使用しているLINQ-to-Entitiesからのもののようです。したがって、LINQ-to-Entitiesにステートメントを直接呼び出させる方法があるかどうかを知りたいだけです。
4 に答える
LINQ / .NETは、SQLクエリsp_executesql
をSQLサーバーへの呼び出しとして送信することによってSQLクエリを実行します。ただし、Database Engine Tuning Advisorは、 SQL Server Profilerによってキャプチャされたステートメントによってそのようなものを解析できないため、チューニングセッションの結果は不十分になります。
sp_executesql
これは、ステートメントを正しく分析できるように、ステートメントをDatabase EngineTuningAdvisorにフィードする前に「ボックス化解除」する方法です。
- SQL Server Profilerでチューニングセッションを実行した(または既存のセッションを開いた)後、[ファイル]>[エクスポート]>[SQLServerイベントの抽出]>[Transact-SQLイベントの抽出... ]を使用して、すべてのSQLステートメントを含む.SQLファイルを保存します。
- .SQLファイル(たとえば、 Notepad ++ 6 - http ://notepad-plus-plus.org/ )を開き、次の検索と置換の正規表現を実行して、すべての
sp_executesql
ステートメントをプレーンTSQLのボックスから外します。検索:^EXEC[\s]+SP_EXECUTESQL[\s]+[N]*'((''|[^'])*)'[\s]*,[\s]*[N]*'((''|[^'])*)'[\s]*,[\s]*([^\n]+)$
置換:BEGIN\nDECLARE \3\nSELECT \5\n\1\nEND
- 次に、 Database Engine Tuning Advisorで作成した「unboxed」.SQLファイルを使用して、追加する必要のあるインデックスを見つけます。
ハッピーチューニング!Notepad ++ 6(またはそれ以上)を選択したことに注意してください。これは、正規表現の実装が非常に優れているため、他のテキストエディターが上記の式の実行に失敗する可能性があります。
アダムに同意します。sp_executesql
エンティティframework/ADO.netでの使用は意図的なものです。次に、パラメータ化されたストアドプロシージャと同様にクエリが実行され、SQLオプティマイザはクエリプランを再利用できます。
DBの調整を検討している場合は、これらのクエリも考慮する必要があります。DBのバックアップを取り、(SQLプロファイラーで)再生トレーステンプレートを使用してクエリをキャプチャし、DBを復元し、チューニングアドバイザ設定を実行してこのトレースへのワークロードを実行することをお勧めします
これは、RPC呼び出しがプロファイラーに表示される方法の成果物にすぎません。Free TDSプロトコルのドキュメントに記載されているように、クライアント要求には主に言語(タイプ0x01)とRPC(タイプ0x03)の2つのタイプがあります。呼び出しがパラメーターを持つSQLバッチである場合、RPC呼び出しはタイプ0x03で、長さは0x0Aで、これはのショートカットですsp_executesql
。
つまり、実際に発生するのは、クライアント(任意のクライアント)がパラメーターを含むバッチを送信すると、sp_executesql
呼び出されているように見えるということです。これは、ODBC、OleDB、SqlClient、Sql Native Clientにも当てはまります。前述したように、どのクライアントでも同様です。したがって、Entity Frameworkでも、実際にsp_executesqlを呼び出すADO.Netでもありません(実際には、要求は呼び出されたかのように実行されますが、プロシージャは実際には呼び出されません。複雑です...)。@parameter
これは、リクエストにを追加するたびに発生するプロトコルのアーティファクトです。
の使用法sp_executesql
はADO.NET効果であり、EntityFrameworkに固有のものではありません。私の知る限り、そのストアドプロシージャを使用しないように指示する方法はありません。