Здравствуйте!
Мне нужно сохранить в БД 50К записей.
Краткое описание методам и объектов:
Class User
{
Virtual ICollection<Coin> Coins { get; set: }
}
Class Coin
{
Virtual IList<Transaction> Transactions {get; set;}
}
Public Task<JsonResult> GetCoins()
{
Var user = await userManager.FindByName(id);
User.Coins = await UpdateCoins();
Await context.BulkSaveChangesAsync();
Return Json(user.Coins);
}
Transaction выглядит так:
Суть метода UpdateCoins: Получить с другого сервиса 50к транзакций и разбить их по монетам. Т.е. В итоге после его выполнения у объекта User будет коллекция Coin размером около 150 объектов и по всем Coin будет разбито 50к объектов Transaction по листам.
Сразу же после метода GetCoins вызывается метод GetTransactions, который уже возвращает user.Coins.First().Transactions.OrderBy(t => t.Date).Reverse().Skip(offset).Take(count), например, т.е. Данные нужны будут сразу же.
После каждого вызова сервис, с которого получались 50к транзакций, может вернуть ещё их какое-то их кол-во, и значения у объектов Coin может обновиться или к ним могут ещё добавиться транзакции.
Сейчас сохранение 50к объектов в БД, занимает 1.5 минуты и CPU трудится при этом на 40%, при записи 200-300 объектов Transaction процентов на 5. Но нужно чтобы весь метод отрабатывал и возвращал значения секунд за 20-30
Прочитал что Bulk должна одним запросом отправлять все вставки
Вопрос:
-Работает ли BulkSaveChangesAsync правильно или как ускорить запись?
Нужно ли для этого может быть работать как-то напрямую с context.Transactions и использовать вручную Insert может быть, или связка user.Coins.Transactions c LazyLoading делает то же самое?
Комп 8гб 4х2.4 и SSD