Я выполняю довольно простой запрос в Microsoft Entity Framework Core 3.0, который выглядит так:
var dbProfile = db.Profiles.Where(x => x.SiteId == Int32.Parse(id))
.Include(x => x.Interests)
.Include(x => x.Pets)
.Include(x => x.Networks)
.Include(x => x.PersonalityTraits)
.SingleOrDefault();
Он отлично работал с EF Core 2.2.6, но при обновлении до EF Core 3.0 этот запрос выполняется мгновенно для 721 профиля, но по крайней мере для одного профиля время ожидания запроса истекает:
Microsoft.Data.SqlClient.SqlException: «Истекло время ожидания выполнения.
Время ожидания истекло до завершения операции или сервера не отвечает».
Затем я зарегистрировал фактический запрос, отправленный на сервер базы данных:
https://stackoverflow.com/a/58348159/3850405
SELECT [t].[Id], [t].[Age], [t].[City], [t].[Country], [t].[County], [t].[DeactivatedAccount], [t].[Gender], [t].[HasPictures], [t].[LastLogin], [t].[MemberSince], [t].[PresentationUpdated], [t].[ProfileName], [t].[ProfilePictureUrl], [t].[ProfileText], [t].[SiteId], [t].[VisitorsCount], [i].[Id], [i].[Name], [i].[ProfileId], [p0].[Id], [p0].[Description], [p0].[Name], [p0].[ProfileId], [n].[Id], [n].[Name], [n].[NetworkId], [n].[ProfileId], [p1].[Id], [p1].[Name], [p1].[ProfileId]
FROM (
SELECT TOP(2) [p].[Id], [p].[Age], [p].[City], [p].[Country], [p].[County], [p].[DeactivatedAccount], [p].[Gender], [p].[HasPictures], [p].[LastLogin], [p].[MemberSince], [p].[PresentationUpdated], [p].[ProfileName], [p].[ProfilePictureUrl], [p].[ProfileText], [p].[SiteId], [p].[VisitorsCount]
FROM [Profiles] AS [p]
WHERE ([p].[SiteId] = '123') AND '123' IS NOT NULL
) AS [t]
LEFT JOIN [Interests] AS [i] ON [t].[Id] = [i].[ProfileId]
LEFT JOIN [Pets] AS [p0] ON [t].[Id] = [p0].[ProfileId]
LEFT JOIN [Networks] AS [n] ON [t].[Id] = [n].[ProfileId]
LEFT JOIN [PersonalityTraits] AS [p1] ON [t].[Id] = [p1].[ProfileId]
ORDER BY [t].[Id], [i].[Id], [p0].[Id], [n].[Id], [p1].[Id]
Затем я попытался запустить фактический SQL в SSMS и получил следующую ошибку:
Msg 1105, уровень 17, состояние 2, строка 1
Не удалось выделить место для объекта «dbo.SORT временное хранилище выполнения: 140737692565504» в базе данных «tempdb», поскольку файловая группа «PRIMARY» заполнена. Создайте дисковое пространство, удалив ненужные файлы, отбросив объекты в файловой группе, добавив дополнительные файлы в файловую группу или включив автоматический рост для существующих файлов в файловой группе.
Мой tempdb
теперь полностью заполнил диск с базой данных. Я пробовал 10 других идентификаторов, и тот же запрос выполняется мгновенно.
Я попытался снова сжать базу данных tempdb с помощью команды DBCC SHRINKDATABASE(tempdb, 10);
, и она сработала нормально. Однако, когда я снова попытался выполнить запросы, произошло то же самое. Если я пропущу включение таблиц, все будет хорошо. В чем может быть проблема и как это исправить? Это известная ошибка в EF Core 3.0? Если посмотреть на запрос в EF Core 2.2.6, он выполняет индивидуальный выбор, подобный этому, для всех таблиц:
SELECT [x.Interests].[Id], [x.Interests].[Name], [x.Interests].[ProfileId]
FROM [Interests] AS [x.Interests]
INNER JOIN (
SELECT TOP(1) [x0].[Id]
FROM [Profiles] AS [x0]
WHERE [x0].[SiteId] = '123'
ORDER BY [x0].[Id]
) AS [t] ON [x.Interests].[ProfileId] = [t].[Id]
ORDER BY [t].[Id]
tempdb
вздутие обычно означает, что таблицы некорректно проиндексированы. Есть ли у вас индексы по всем полям внешнего ключа иSiteId
? Кроме того, статистика бега может иметь огромное значение. - person Gert Arnold   schedule 21.11.2020