Я учусь asp. net core mvc 3.1. И не могу понять, почему мой запрос такой медленный. Вот сгенерированный запрос EFCore (скопированный из DebugConsole)
SELECT [p].[TagID],
[p].[CategoryID],
[p].[PicID],
[p].[TagSysType],
[p].[TagDescription],
[p].[TagPriority],
[p].[TagName],
[p].[TagTypeID],
[p].[PeriodID],
[p].[LinkID],
[p].[SourceID],
[p0].[LinkID],
[p0].[LinkLongName],
[p0].[LinkName],
[p1].[PeriodID],
[p1].[PeriodName],
[s].[SourceID],
[s].[CategoryID],
[s].[SourceName],
[s].[SourcePriority],
[p2].[TagTypeID],
[p2].[TagTypeName],
[e].[PicID],
[e].[PicName],
[c].[CategoryID],
[c].[CategoryGroupID],
[c].[CategoryName],
[a].[TagID],
[a].[Cost],
[a].[Scale],
[a].[Date],
[a].[Partner]
FROM [Tag] AS [p]
INNER JOIN [Link] AS [p0] ON [p].[LinkID] = [p0].[LinkID]
INNER JOIN [Period] AS [p1] ON [p].[PeriodID] = [p1].[PeriodID]
INNER JOIN [Source] AS [s] ON [p].[SourceID] = [s].[SourceID]
INNER JOIN [TagType] AS [p2] ON [p].[TagTypeID] = [p2].[TagTypeID]
LEFT JOIN [Pic] AS [e] ON [p].[PicID] = [e].[PicID]
INNER JOIN [Category] AS [c] ON [p].[CategoryID] = [c].[CategoryID]
LEFT JOIN [Sale] AS [a] ON [p].[TagID] = [a].[TagID]
Результат этого запроса содержит около 10000 строк, и они мне нужны в моем приложении (без фильтрации). Проблема в том, что время выполнения этого запроса составляет около 25 секунд. Я думал, что это слишком сложный запрос (с большим количеством JOIN) для базовой технологии net или ужасной архитектуры базы данных, но когда я запускаю этот запрос в SQL Studio Management, он выполняется почти мгновенно, если мое приложение в студии остановлено. Если мое приложение работает, время выполнения запроса в SQL Studio Management также занимает около 25 секунд. Приложение (Net core 3.1) и база данных (SQL2008) работают на одном сервере (Win2012).
Почему это происходит?
Мое действие в контроллере:
public IActionResult Index()
{
ViewBag.PagingVisible = false;
IQueryable<Tag> tags = _context.Tag
.Include(s => s.Link)
.Include(s => s.Period)
.Include(s => s.Source)
.Include(s => s.TagType)
.Include(s => s.Pic);
.Include(s => s.Category);
.Include(s => s.Sale);
return PartialView("_SearchResult", tags.ToList());
}