Ускорить поиск по ChangeTracker.Entities
От: merge  
Дата: 06.01.24 20:39
Оценка:
Есть проблема с поиском в этом массиве.
Текущая логика сделана так что в цикле идет вставка по одной сущности определенного типа, но проверяется нет ли сущности с таким же ключом уже в контексте.

_dbContext.Entities.AsNoTracking().Where(a => a.Key == obj.Key);

Key- string



Так вот, проблема начинается в поиске когда уже вставлено больше 500 объектов. Вначале поиск занимает мало времени, а когда уже вставлено порядка 400 объектов, то поиск занимает по 3 секунды.
Пытался использовать представление Local

но что-то не сильно помогло.
Как можно ускорить поиск не сильно меняя логику?
Re: Ускорить поиск по ChangeTracker.Entities
От: RushDevion Россия  
Дата: 06.01.24 22:04
Оценка:
M>
M>_dbContext.Entities.AsNoTracking().Where(a => a.Key == obj.Key);
M>

Есть мнение, что здесь не в db-контексте поиск происходит, а каждый раз выполняется полноценный запрос в БД.
Чтобы искало сначала в контексте — есть метод Find.
Если нужно искать только в контексте без похода в БД, можно написать свой extension, который будет смотреть в change tracker. Либо трекать дубликаты через отдельный HashSet.

Если же нужна максимальная производительность — то убери ef core. Заливай через bulk insert во временную stage таблицу и затем, обединяй с основной через merge.
Re: Ускорить поиск по ChangeTracker.Entities
От: Разраб  
Дата: 07.01.24 01:01
Оценка:
Здравствуйте, merge, Вы писали:


M>Так вот, проблема начинается в поиске когда уже вставлено больше 500 объектов. Вначале поиск занимает мало времени, а когда уже вставлено порядка 400 объектов, то поиск занимает по 3 секунды.


Для начала проиндексировать по ключу. И подумать зачем вообще искать? если нужна уникальность, то добавить ограничение уникальности на колонку и вставляй без проверки.
☭ ✊ В мире нет ничего, кроме движущейся материи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.