Асинхронная операция Entity Framework занимает в десять раз больше времениC#

Место общения программистов C#
Anonymous
Асинхронная операция Entity Framework занимает в десять раз больше времени

Сообщение Anonymous »

У меня есть сайт MVC, который использует Entity Framework 6 для обработки базы данных, и я экспериментировал с его изменением, чтобы все работало как асинхронные контроллеры, а вызовы к базе данных выполнялись как их асинхронные аналоги (например. ToListAsync() вместо ToList())

Проблема, с которой я столкнулся, заключается в том, что простое изменение моих запросов на асинхронные привело к тому, что они стали невероятно медленными.

Следующий код получает коллекцию объектов «Альбом» из моего контекста данных и преобразуется в довольно простое соединение с базой данных:

Код: Выделить всё

// 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 сообщает, что для завершения требуется 5742 мс.

Если я изменю свой код на:

Код: Выделить всё

// Get the albums
var albums = this.context.Albums
.Where(x => x.Artist.ID == artist.ID)
.ToList();
Затем генерируется точно такой же SQL, но, согласно данным SQL Server Profiler, он выполняется всего за 474 мс.

База данных содержит около 3500 строк в таблице «Альбомы», что на самом деле не так уж и много, и имеет индекс в столбце «Artist_ID», поэтому работа должна выполняться довольно быстро.

Я знаю, что асинхронность сопряжена с накладными расходами, но замедлить работу в десять раз мне кажется слишком крутым! Где я здесь ошибаюсь?

Подробнее здесь: https://stackoverflow.com/questions/285 ... o-complete

Вернуться в «C#»