2015-03-14 3 views
2

У меня есть база данных около миллиона записей. Я делаю запрос с использованием структуры сущностей, и ведение журнала сообщает мне, что фактическое время выполнения составляет 60 мс. Я не понимаю, почему, но полное время выполнения составляет 3 секунды ... (BeforeToList + AfterToList). Только 10 строк извлекаются ...Entity Framework медленно загружается

3 секунды очень медленно ...

Вот код:

public IEnumerable<Event> GetEvents(IEnumerable<int> idList) 
    { 
     using (var db = new context()) 
     { 
      db.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); 
      var watch = Stopwatch.StartNew(); 
      var query = db.Event.Where(o => idList.Contains(o.EventId)); 
      var elapsedMs1 = watch.ElapsedMilliseconds; 
      watch.Stop(); 
      watch.Reset(); 
      watch.Start(); 

      var query2 = query.ToList(); 
      watch.Stop(); 
      var elapsedMs2 = watch.ElapsedMilliseconds; 

      Console.WriteLine("data.BeforeToList:" + elapsedMs1 + " --- AfterToList:" + elapsedMs2); 
      return query2; 
     } 
    } 

А вот выход:

Test Name: IsGetEventsReturn10Result 
Test Outcome: Passed 
Result StandardOutput: 

data.BeforeToList:1148 --- AfterToList:2883 


Debug Trace: 
Opened connection at 2015-03-13 21:15:40 -04:00 

SELECT 
    [Extent1].[EventId] AS [EventId], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[UrlReference] AS [UrlReference], 
    [Extent1].[Date] AS [Date], 
    [Extent1].[TimezoneId] AS [TimezoneId], 
    [Extent1].[Image1Id] AS [Image1Id], 
    [Extent1].[Image2Id] AS [Image2Id], 
    [Extent1].[CreatedBy] AS [CreatedBy], 
    [Extent1].[CreatedOn] AS [CreatedOn], 
    [Extent1].[UpdatedOn] AS [UpdatedOn], 
    [Extent1].[Status] AS [Status], 
    [Extent1].[SourceId] AS [SourceId], 
    [Extent1].[Source] AS [Source], 
    [Extent1].[CategoryID] AS [CategoryID], 
    [Extent1].[Price] AS [Price], 
    [Extent1].[Description] AS [Description], 
    [Extent1].[DescriptionUrl] AS [DescriptionUrl] 
    FROM [dbo].[Event] AS [Extent1] 
    WHERE [Extent1].[EventId] IN (366623, 366622, 366621, 366620, 366619, 366618, 366617, 366616, 366615, 366614) 


-- Executing at 2015-03-13 21:15:41 -04:00 

-- Completed in 60 ms with result: SqlDataReader 



Closed connection at 2015-03-13 21:15:41 -04:00 
+1

Сколько записей вы получили? Каков ваш дизайн базы данных? И.Е. Структура таблицы Я предлагаю запустить SQL в базе данных и посмотреть, сколько времени потребуется, если возможно, попытаться выполнить план выполнения. – User2012384

+0

Из-за ленивой загрузки запрос, вероятно, не выполняется, пока вы не вызовете 'query.ToList()' – JNYRanger

+0

@Mr. 香港人 Только 10 строк выбраны ... @JNYRanger Я понимаю это, но все еще за 1 секунду до того, как 'ToList()' и 2 сек для 'ToList()' не имеет никакого смысла ... – Hemadeus

ответ

0

После комментарии jlew, я нашел хорошую статью, объясняющую разницу между первым вызовом (холодный запрос) и другими (теплый запрос).

https://msdn.microsoft.com/en-ca/data/hh949853.aspx

Чтобы холодный запрос быстрее, я предварительно сгенерированные мнение с помощью Entity Framework Power Tools.

Сменить код не требовалось.

Смежные вопросы