動的に作成されたLINQtoSQLクエリがあります。面白いことに、SQL Management Studioで実行すると、非常に高速になります。L2Sから実行すると、しばらくすると非常に遅くなります。
これは、クエリプラン/実行プランが原因である可能性があります。SQL Serverを再起動すると、L2Sクエリも非常に高速になります。
T-SQLを使用すると、WITHRECOMPILEを使用できます。しかし、L2Sでこれを行う方法は?
動的に作成されたLINQtoSQLクエリがあります。面白いことに、SQL Management Studioで実行すると、非常に高速になります。L2Sから実行すると、しばらくすると非常に遅くなります。
これは、クエリプラン/実行プランが原因である可能性があります。SQL Serverを再起動すると、L2Sクエリも非常に高速になります。
T-SQLを使用すると、WITHRECOMPILEを使用できます。しかし、L2Sでこれを行う方法は?
以下のスレッドで見つけたように、を使用して、実行したいクエリのDataContext.GetCommand(IQueryable)
を取得できます。DbCommand
コマンドテキストに「OPTION(RECOMPILE)」を追加し、そこからリーダーを開き、[DataContext.Translate<T>
] 1を使用して、開いたリーダーを目的のエンティティタイプに変換できます。
http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/def80609-eaf2-4631-8d3d-ad10fc9aedfa
たとえば、DataContext dataContext
:
IQueryable<string> exampleItemsQuery = dataContext.Table.Where(…).Select(…); //etc
DbCommand command = dataContext.GetCommand(exampleItemsQuery);
command.CommandText += Environment.NewLine + "OPTION (RECOMPILE)";
if (dataContext.Connection.State != ConnectionState.Open)
dataContext.Connection.Open();
IEnumerable<string> exampleItems = dataContext.Translate<string>(command.ExecuteReader(CommandBehavior.CloseConnection));
あなたが説明する振る舞いから、あなたの統計はほぼ確実に時代遅れです。
それらを再構築することをお勧めします:
exec sp_MSForeachTable 'UPDATE STATISTICS ?'
CompiledQueryクラスを確認してください。これは、さらに詳細に説明するMicrosoftのチュートリアルです。
このEF6パラメータスニッフィングを使用して、実行前にSQLコマンド「option(recompile)」の最後に追加しました。それは私のために働きます。それを解決する方法は非常に良い回避策です。
;) あなたはそうしない。Simlpe。露出していません。
ただし、動的クエリには「WITHRECOMPILE」は必要ありません。遅い場合は、ManagementStudioでクエリを確認してください。すべてのユーザーが実行パスを共有します。
遅いのはSQLServerではないでしょうか。しかし、LINQ(つまりクライアント側の処理)?
実行するクエリは何ですか?