MYSQL教程MySql批量插入优化Sql执行效率实例详解
发布时间:2020-12-12 01:24:31 所属栏目:MySql教程 来源:网络整理
导读:《MYSQL教程MySql批量插入优化Sql执行效率实例详解》要点: 本文介绍了MYSQL教程MySql批量插入优化Sql执行效率实例详解,希望对您有用。如果有疑问,可以联系我们。 MySql批量插入优化Sql执行效率实例详解 MYSQL数据库 itemcontractprice数量1万左右,每条ite
《MYSQL教程MySql批量插入优化Sql执行效率实例详解》要点: MySql批量插入优化Sql执行效率实例详解MYSQL数据库 itemcontractprice数量1万左右,每条itemcontractprice 插入5条日志.MYSQL数据库 updateInsertSql.AppendFormat("UPDATE itemcontractprice AS p INNER JOIN foreigncurrency AS f ON p.ForeignCurrencyId = f.ContractPriceId SET p.RemainPrice = f.RemainPrice * {0},p.BuyOutPrice = f.BuyOutPrice * {0},p.ReservedPrice = f.ReservedPrice * {0},p.CollectedPrice = f.CollectedPrice * {0},p.AccessPrice = f.AccessPrice * {0} WHERE p.CurrencyId = {1} AND p.date BETWEEN '{2:yyyy-MM-dd}' AND '{3:yyyy-MM-dd}';",rate.ExchangeRate,exchangeRate.CurrencyId,rate.BeginDate,rate.EndDate); updateInsertSql.AppendFormat("INSERT INTO `itemcontractpricelog`(`ContractPriceType`,`ContractPrice`,`FcContractPrice`,`IsExpire`,`LogRemark`,`CreatedByName`,`CreatedById`,`CreatedDate`,`LogTypeId`,`ProviderId`,`StageId`,`Date`,`CurrencyId`,`ContractPriceId`,`StockPattern`,`ItemId`) SELECT 0,c.RemainPrice,f.RemainPrice,c.RemainIsExpire,'外币汇率调整,重新计算人民币底价','job',NOW(),5,c.ProviderId,c.StageId,c.Date,c.CurrencyId,c.ContractPriceId,c.ItemId FROM itemcontractprice AS c INNER JOIN foreigncurrency AS f ON c.ForeignCurrencyId = f.ContractPriceId WHERE c.CurrencyId={0} AND c.date BETWEEN '{1:yyyy-MM-dd}' AND '{2:yyyy-MM-dd}';",rate.EndDate); updateInsertSql.AppendFormat(" INSERT INTO `itemcontractpricelog`(`ContractPriceType`,`ItemId`) SELECT 1,c.BuyOutPrice,f.BuyOutPrice,c.BuyOutIsExpire,`ItemId`) SELECT 2,c.ReservedPrice,f.ReservedPrice,c.ReservedIsExpire,`ItemId`) SELECT 3,c.CollectedPrice,f.CollectedPrice,c.CollectedIsExpire,rate.EndDate); updateInsertSql.AppendFormat("INSERT INTO `itemcontractpricelog`(`ContractPriceType`,`ItemId`) SELECT 4,c.AccessPrice,f.AccessPrice,c.AccessIsExpire,rate.EndDate); //var curContractPriceList = itemContractPriceList.Where(o => o.CurrencyId == exchangeRate.CurrencyId && o.Date >= rate.BeginDate && o.Date <= rate.EndDate).ToList(); logger.InfoFormat("底价更新和日志sql:{0}",updateInsertSql.ToString()); //if (curContractPriceList.Count == 0) continue; int effctRows = 0; using (var tran = UnitOfWorkManager.Begin()) { effctRows = taskRepository.ExecuteSql(updateInsertSql.ToString(),false); tran.Complete(); } logger.InfoFormat("底价更新影响行数:{0}",effctRows); 正常情况下大概20秒钟就ok. 之前是用EF操作,查询出来,要耗时,然后再组装 update语句,然后再插入日志(每条数据5条日志),这个网络交互的时间加上数据库连接打开关闭的时间,总的执行时间,大概10多分钟.MYSQL数据库 用sql语句批量操作,可以说效率提升了 40倍,就是大量数据的传输和数据库的处理次数耗时.MYSQL数据库 所以说,软件开发不是开发完成就行,而是要解决性能上的问题,这才是开发的进阶.MYSQL数据库 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!MYSQL数据库 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |