Ive получил сайт MVC, который использует Entity Framework 6 для обработки базы данных, и я экспериментировал с его изменением, так что все работает как async-контроллеры и вызовы в базу данных выполняются как их асинхронные копии (например, ToListAsync() of ToList())
Проблема Im заключается в том, что простое изменение моих запросов на async привело к невероятным замедлениям.
Следующий код получает коллекцию объектов "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
Как бы то ни было, это не массовый сложный запрос, а его запуск почти на 6 секунд для запуска SQL-сервера. Провайдер SQL Server сообщает об этом как 5742 мс.
Если я изменю свой код на:
// Get the albums
var albums = this.context.Albums
.Where(x => x.Artist.ID == artist.ID)
.ToList();
Затем генерируется тот же самый SQL, но он работает только с 474ms в соответствии с SQL Server Profiler.
В таблице "Альбомы" содержится около 3500 строк, что на самом деле не очень много, и имеет индекс в столбце "Artist_ID", поэтому он должен быть довольно быстрым.
Я знаю, что async имеет накладные расходы, но делать вещи в десять раз медленнее, кажется немного крутым для меня! Где я здесь не так?