Итак, у меня есть очень простая модель данных в моем проекте (нацеленная на .NET 4.0, с использованием EF 5, установленного NuGet, сначала база данных) с двумя таблицами, Item и ItemGroup.
Item-table имеет различные поля, как строковые, так и числовые, а также внешний ключ, указывающий на ItemGroup.
С другой стороны, ItemGroup имеет только идентификатор, имя и код (последние 2 из которых являются строками).
Теперь у меня примерно 50 тыс. элементов и только 100 групп элементов. Если я выполняю context.Items.ToList()
с помощью SQL Profiler, продолжительность составляет около 2-3 секунд, что вполне приемлемо. Однако, если я хочу одновременно загрузить группы элементов с помощью context.Items.Include("ItemGroup").ToList()
, время выполнения увеличивается примерно до 12 секунд. Кроме того, если я просто извлеку все группы элементов после извлечения всех элементов, время выполнения также будет очень большим. Это наводит меня на мысль, что именно сопоставление элементов с их соответствующими группами занимает время.
Однако это по-прежнему не объясняет, почему SQL Profiler сообщает, что очень простой запрос INNER JOIN занимает более 10 секунд, по сравнению с тем же самым запросом без JOIN, который занимает всего 2-3 секунды.
Я в растерянности, никогда раньше не сталкивался с такой проблемой, поэтому любые советы более чем приветствуются.