EntityFramework - время выполнения запроса зависит от выбранного порядка? - PullRequest
5 голосов
/ 19 января 2012

Я замечаю странное поведение.У меня есть таблицы торговцев и заказов, и я делаю два выбора один, за другим, выбор очень прост (выберите * у продавца, выберите * из заказа).

Вот трассировка sql profiler, когда я выбираю первых торговцев, затем заказы: enter image description here

заметьте, что выбор заказов занимает колоссальные 75 секунд (то есть для ~ 80.000 записей, на действительно приличной машине 8 ГБ ОЗУ, ssd, i7).

Теперь, если я изменил последовательность и выбрал первые заказы, то торговцы: enter image description here

время выполнения запроса заказа в профилировщике сократилось до 2,5 секунд, но в приложении оно примерно такое же, как в первом случае (я полагаю,потому что EF внутри пытается связать заказы с торговцами, так как между ними есть внешний ключ).

Итак, вопрос в том, почему профилировщик видит разное время и что EF делает во втором случае так долго, может быть, что-то настроено неправильно?

ОБНОВЛЕНИЕ : Я началлокализовать проблему с чистой моделью EF, и она работает нормально.Я использую шаблоны EF T4 для генерации классов контекста и сущностей, поэтому, возможно, они устарели и вызывают проблемы, дадут знать, если найдут что-то конкретное, - я думаю, что это как-то связано с коллекциями исправлений, поэтому похоже, что SQL profiler вводит в заблуждение- Я думаю, что запрос был выполнен нормально, просто он ожидал, что EF завершит чтение результатов или что-то в этом роде (я имею в виду, что EF делает что-то экспансивное при чтении результатов).

 using (var myEntities = new myEntities())
        {
            var merchants = myEntities.Merchants.ToList();
            var orders = myEntities.Orders.ToList();
        }

Ответы [ 3 ]

2 голосов
/ 19 января 2012

Показания идентичны: только ЦП и продолжительность отличаются для обоих наборов данных.

На первой итерации вы загружаете данные в кэш SQL Server с диска. Затем второй запрос считывает 4008 страниц из ОЗУ, а не с диска. То же самое происходит с данными продавца, но в меньшем масштабе

Примечание: данные таблицы и индексы кэшируются, не результаты запроса. Запрос будет выполняться каждый раз заново. Этот кеш обновляется SQL Server

Вы сказали, что это повторяется: покажите нам код. Не запускаются какие-либо DBCC, которые очищают кеш? Настройки SET одинаковы?

1 голос
/ 19 января 2012

Продолжительность включает время выполнения и выборки.Поскольку в случае, когда торговцы уже загружены в контекст, EF должен установить FK во время материализации экземпляра Order, выборка происходит медленнее.

0 голосов
/ 19 января 2012

Итак, я обнаружил проблему - устаревшие шаблоны POCO, предоставлены MS .Профилировщик Ants показывает, что большую часть времени тратится на управление коллекциями исправлений.

Использование шаблонов T4: 77.4124277 секунд
Использование сгенерированного по умолчанию кода edmx: 1.783102 секунд

и, как отметил Виталий, - Длительность SQL Profiler включает в себя время выполнения и выборки, я думаю, именно это меня и озадачило.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...