[c#] Entity Framework 비동기 작업을 완료하는 데 10 배의 시간이 소요됩니다.



0 Answers

Question

Entity Framework 6을 사용하여 데이터베이스를 처리하는 MVC 사이트가 있는데, 모든 것을 비동기 컨트롤러로 실행하고 데이터베이스 호출을 비동기 대상 (예 : ToListAsync ())으로 실행하도록 변경했습니다. ToList () 대신에)

문제는 단순히 비동기로 쿼리를 변경하면 엄청나게 느려졌 기 때문입니다.

다음 코드는 내 데이터 컨텍스트에서 "Album"개체의 컬렉션을 가져오고 매우 간단한 데이터베이스 조인으로 변환됩니다.

// Get the albums
var albums = await this.context.Albums
    .Where(x => x.Artist.ID == artist.ID)
    .ToListAsync();

다음은 생성 된 SQL입니다.

exec sp_executesql N'SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[URL] AS [URL], 
[Extent1].[ASIN] AS [ASIN], 
[Extent1].[Title] AS [Title], 
[Extent1].[ReleaseDate] AS [ReleaseDate], 
[Extent1].[AccurateDay] AS [AccurateDay], 
[Extent1].[AccurateMonth] AS [AccurateMonth], 
[Extent1].[Type] AS [Type], 
[Extent1].[Tracks] AS [Tracks], 
[Extent1].[MainCredits] AS [MainCredits], 
[Extent1].[SupportingCredits] AS [SupportingCredits], 
[Extent1].[Description] AS [Description], 
[Extent1].[Image] AS [Image], 
[Extent1].[HasImage] AS [HasImage], 
[Extent1].[Created] AS [Created], 
[Extent1].[Artist_ID] AS [Artist_ID]
FROM [dbo].[Albums] AS [Extent1]
WHERE [Extent1].[Artist_ID] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=134

일이 진행됨에 따라 복잡한 질의가 아니라 SQL 서버가 실행되는 데 약 6 초 가량 소요됩니다. SQL Server Profiler는이를 완료하기 위해 5742ms를 사용한다고보고합니다.

내 코드를 다음과 같이 변경하는 경우 :

// Get the albums
var albums = this.context.Albums
    .Where(x => x.Artist.ID == artist.ID)
    .ToList();

그런 다음 정확히 동일한 SQL이 생성되지만 SQL Server Profiler에 따라 474ms 만 실행됩니다.

데이터베이스에는 "앨범"테이블에 약 3500 개의 행이 있습니다. 실제로는별로 많지 않으며 "Artist_ID"열에 대한 색인이 있으므로 매우 빨라야합니다.

비동기에는 오버 헤드가 있지만, 일을 10 배 느리게하는 것은 나에게 가파른 것처럼 보입니다! 내가 여기서 어디로 잘못 가고 있니?




Related