There is a base SQLite, with tables - Messages and Users . Contains approximately 100,000 users.
It is necessary to add / update messages, and users who have made reposts. For every 100 messages, there are ~ 6000 repost users. Now adding 1 message (in which ~ 300 reposts), if all the repost users are not in the database, takes ~ 14 seconds (is this normal?).
I do this:
using (AppDbContext db = new AppDbContext()) { // Получаем всех пользователей, чтобы сравнивать с репостнувшими пользователями usersFromDb = db.Users.ToList(); /***** Т.к. пользователей в базе много, получение всех пользователей не оптимально. Но лучше ли будет делать много запросов (для каждого пользователя), вместо этого одного? *****/ } using (AppDbContext db = new AppDbContext()) { foreach (var message in messages) { if (message.RepostUsers != null) { // Проходим по списку репостнувших пользователей /***** Эта часть занимает много времени Можно ли оптимизировать? *****/ foreach (var user in message.RepostUsers) { // Ищем по пользователям из базы var dbUser = usersFromDb.Find(u => u.Id == user.Id); if (dbUser == null) { // Если не нашли, помечаем новым db.Entry(user).State = EntityState.Added; } else if (dbUser.Name != user.Name) { // Если нашли и есть изменения, помечаем измененным db.Entry(user).State = EntityState.Modified; } else { // Если нашли и изменений нет, помечаем не измененным db.Entry(user).State = EntityState.Unchanged; } } } // Получаем Message из базы var dbMessage = db.Messages.AsNoTracking().FirstOrDefault(p => p.Id == message.Id); // Message всегда либо новое, либо измененное. Помечаем db.Entry(message).State = dbMessage != null ? EntityState.Modified : EntityState.Added; } db.Messages.AddRange(messages); db.SaveChanges(); } Question 1.
Because There are a lot of users in the database, getting all users is not optimal. But would it be better to make a lot of requests (separately for each repost user) instead of one?
Question 2.
When changing users' states through db.Entry(user).State , are objects placed in the cache to track changes? Those. AsNoTracking not counted? If so, should this be changed and how?
usersFromDbto make the type HashSet. It will be many times faster. - RusArtHashSet<User> usersFromDb;? ThenusersFromDb = db.Users.ToList();does not workusersFromDb = db.Users.ToList();- tretetexusersFromDb = new HashSet(db.Users.ToList())- RusArt