3

動的に作成されたLINQtoSQLクエリがあります。面白いことに、SQL Management Studioで実行すると、非常に高速になります。L2Sから実行すると、しばらくすると非常に遅くなります。

これは、クエリプラン/実行プランが原因である可能性があります。SQL Serverを再起動すると、L2Sクエリも非常に高速になります。

T-SQLを使用すると、WITHRECOMPILEを使用できます。しかし、L2Sでこれを行う方法は?

4

5 に答える 5

5

以下のスレッドで見つけたように、を使用して、実行したいクエリの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));
于 2012-06-06T17:07:39.323 に答える
2

あなたが説明する振る舞いから、あなたの統計はほぼ確実に時代遅れです。

それらを再構築することをお勧めします:

exec sp_MSForeachTable 'UPDATE STATISTICS ?'
于 2010-03-11T07:43:05.887 に答える
0

CompiledQueryクラスを確認してください。これは、さらに詳細に説明するMicrosoftのチュートリアルです。

于 2010-03-11T07:35:57.507 に答える
0

このEF6パラメータスニッフィングを使用して、実行前にSQLコマンド「option(recompile)」の最後に追加しました。それは私のために働きます。それを解決する方法は非常に良い回避策です。

于 2016-04-29T21:33:56.890 に答える
-1

;) あなたはそうしない。Simlpe。露出していません。

ただし、動的クエリには「WITHRECOMPILE」は必要ありません。遅い場合は、ManagementStudioでクエリを確認してください。すべてのユーザーが実行パスを共有します。

遅いのはSQLServerではないでしょうか。しかし、LINQ(つまりクライアント側の処理)?

実行するクエリは何ですか?

于 2010-03-11T07:37:15.910 に答える