16

次の linq-to-entities クエリはスローします

エンティティ フレームワークのタイムアウトが期限切れになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。

ToList()した後。

 var q = (from contact 
          in cDB.Contacts.Where(x => x.Templategroepen.Any(z => z.Autonummer == templategroep.Autonummer) 
                                && !x.Uitschrijvings.Any(t => t.Templategroep.Autonummer == templategroep.Autonummer)) 
          select contact.Taal).Distinct();

((System.Data.Objects.ObjectQuery)q).ToTraceString()私に与えます:

SELECT 
[Distinct1].[Taal] AS [Taal]
FROM ( SELECT DISTINCT 
[Extent1].[Taal] AS [Taal]
FROM [dbo].[ContactSet] AS [Extent1]
WHERE ( EXISTS (SELECT 
1 AS [C1]
FROM [dbo].[TemplategroepContact] AS [Extent2]
WHERE ([Extent1].[Autonummer] = [Extent2].[Contacts_Autonummer]) AND ([Extent2].[Templategroepen_Autonummer] = @p__linq__0)
)) AND ( NOT EXISTS (SELECT 
1 AS [C1]
FROM [dbo].[UitschrijvingenSet] AS [Extent3]
WHERE ([Extent1].[Autonummer] = [Extent3].[Contact_Autonummer]) AND ([Extent3].[Templategroep_Autonummer] = @p__linq__1)
))
)  AS [Distinct1]

tracestring からのクエリは、SQL 管理スタジオで 1 秒未満で実行されますが、実際にリストするときにタイムアウトしますか? それはどのように再び可能ですか?

*更新: クエリの SQL PROFILER 出力を追加 * これは EF ToList() と同じくらい遅く実行されます (>30 秒)

exec sp_executesql N'SELECT 
[Distinct1].[Taal] AS [Taal]
FROM ( SELECT DISTINCT 
    [Extent1].[Taal] AS [Taal]
    FROM [dbo].[ContactSet] AS [Extent1]
    WHERE ( EXISTS (SELECT 
        1 AS [C1]
        FROM [dbo].[TemplategroepContact] AS [Extent2]
        WHERE ([Extent1].[Autonummer] = [Extent2].[Contacts_Autonummer]) AND ([Extent2].[Templategroepen_Autonummer] = @p__linq__0)
    )) AND ( NOT EXISTS (SELECT 
        1 AS [C1]
        FROM [dbo].[UitschrijvingenSet] AS [Extent3]
        WHERE ([Extent1].[Autonummer] = [Extent3].[Contact_Autonummer]) AND ([Extent3].[Templategroep_Autonummer] = @p__linq__1)
    ))
)  AS [Distinct1]',N'@p__linq__0 int,@p__linq__1 int',@p__linq__0=1,@p__linq__1=1
4

5 に答える 5

12

この問題は EF6 で確認されました。

await _context.Database.SqlQuery<MyType>(sql)タイムアウト値を 60 秒まで上げてもタイムアウトしていました。ただし、SSMS でまったく同じ SQL (渡した SQL が変更されていないことを確認するためにプロファイラーを使用) を実行すると、1 秒で期待どおりの結果が得られました。

exec sp_updatestats

私の問題を修正しました。

于 2016-12-22T20:42:01.467 に答える
2
(DBCC FREEPROCCACHE)
DBCC DROPCLEANBUFFERS

今のところ問題は解決しましたが、それは一時的なものかもしれません。解決

于 2012-07-06T06:27:11.640 に答える
2

EF6でも同様の問題がありました。EF で SqlQuery 関数を使用すると、Management Studio でミリ秒単位でクエリが実行されたにもかかわらず、タイムアウトになりました。EFクエリで使用したSQLパラメータの1つの値が原因であることがわかりました。明確にするために、以下は私が経験した同様の SQL クエリです。

SELECT * FROM TBL WHERE field1 > @p1 AND field2>@p2 AND field3<@p3

@p1 がゼロの場合、タイムアウト例外を受け取りました。1とか違うものにしたらミリ秒単位で実行されました。ちなみに、クエリを実行したテーブルには 2,000 万行以上あります。

お役に立てば幸いです、ベスト

于 2014-11-21T11:48:10.397 に答える
2

これは少し遅れていることはわかっていますが、答えはここで見つかりました。

基本的に、Entity Framework はデフォルトですべてを追跡します。必要ない場合 (つまり、エンティティを挿入、更新、または削除しない場合) は、オフにしてクエリを高速化します。

Entity Framework Code First を使用している場合は、次のように実現できます。

var q = (from contact
      in cDB.Contacts.AsNoTracking()
          .Where(x => x.Templategroepen.Any(z => z.Autonummer == templategroep.Autonummer) 
                            && !x.Uitschrijvings.Any(t => t.Templategroep.Autonummer == templategroep.Autonummer)) 
      select contact.Taal).Distinct();
于 2013-02-21T23:33:47.500 に答える