LINQ AsNoTracking работает медленно - PullRequest
1 голос
/ 07 июня 2019

Мне нужен неотредактированный список элементов из моей БД. Он работал медленно, поэтому я пытался поскрипывать, что скорость увеличивается.

Итак, я добавил AsNoTracking в запрос LINQ, и он работал медленнее!

Следующий код занял в среднем 7,43 секунды. AsNoTracking - после , где

var result = await _context.SalesOrderItems.Where(x => x.SalesOrderId == SalesOrderId ).AsNoTracking().ToListAsync();

Следующий код занял в среднем 8,62 секунды. AsNoTracking - до , где

var result = await _context.SalesOrderItems.AsNoTracking().Where(x => x.SalesOrderId == SalesOrderId ).ToListAsync();

Следующий код занял в среднем 6,95 секунды. Нет AsNoTracking

var result = await _context.SalesOrderItems.Where(x => x.SalesOrderId == SalesOrderId ).ToListAsync();

Так я что-то упустил? Я всегда, хотя AsNoTracking () должен работать быстрее, и идеально подходит для списка только для чтения. Также у этой таблицы есть две дочерние таблицы.

1 Ответ

0 голосов
/ 07 июня 2019

При первом запуске запроса его необходимо скомпилировать. Если объекты уже отслеживается контекстом, тогда запрос отслеживания вернется эти экземпляры, а не создание новых.

Именно поэтому отслеживаемые объекты могут выполняться быстрее, чем с AsNoTracking ().

https://github.com/aspnet/EntityFrameworkCore/issues/14366

Но время выполнения около 7 секунд означает, что это не проблема с / без отслеживания. Это означает проблему с базой данных (например, не с индексированным столбцом). Около 1,5 миллиардов записей получаются с 30 мл, но не с секундами, если данные настроены правильно.

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