MySql-Batch-Insert-Optimierung. Beispiel für SQL-Ausführungseffizienz. Detaillierte Erklärung Die Anzahl der Artikelvertragspreise beträgt etwa 10.000 und für jeden Artikelvertragspreis werden 5 Protokolle eingefügt. 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',0,NOW(),5,c.ProviderId,c.StageId,c.Date,c.CurrencyId,c.ContractPriceId,0,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}';", 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 1,c.BuyOutPrice,f.BuyOutPrice,c.BuyOutIsExpire,'外币汇率调整,重新计算人民币底价','job',0,NOW(),5,c.ProviderId,c.StageId,c.Date,c.CurrencyId,c.ContractPriceId,0,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}';", 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 2,c.ReservedPrice,f.ReservedPrice,c.ReservedIsExpire,'外币汇率调整,重新计算人民币底价','job',0,NOW(),5,c.ProviderId,c.StageId,c.Date,c.CurrencyId,c.ContractPriceId,0,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}';", 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 3,c.CollectedPrice,f.CollectedPrice,c.CollectedIsExpire,'外币汇率调整,重新计算人民币底价','job',0,NOW(),5,c.ProviderId,c.StageId,c.Date,c.CurrencyId,c.ContractPriceId,0,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}';", 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 4,c.AccessPrice,f.AccessPrice,c.AccessIsExpire,'外币汇率调整,重新计算人民币底价','job',0,NOW(),5,c.ProviderId,c.StageId,c.Date,c.CurrencyId,c.ContractPriceId,0,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}';", exchangeRate.CurrencyId, rate.BeginDate, rate.EndDate); //var curContractPriceList = itemContractPriceList.Where(o => o.CurrencyId == exchangeRate.CurrencyId && o.Date >= rate.BeginDate && o.Date <= rate.EndDate).ToList(); logger.InfoFormat("Reservepreis-Update und Log-SQL:{0}", updateInsertSql.ToString()); //wenn (curContractPriceList.Count == 0) fortfahren; In diesem Beispiel wird die Anzahl der Zeilen in der Zeile 0 angegeben. mit (var tran = UnitOfWorkManager.Begin()) { effctRows = taskRepository.ExecuteSql(updateInsertSql.ToString(), false); tran.Abschließen(); } logger.InfoFormat("Anzahl der von der Aktualisierung des Mindestpreises betroffenen Zeilen: {0}", effctRows); Normalerweise dauert es etwa 20 Sekunden. Zuvor haben wir EF zum Abfragen verwendet, was zeitaufwändig war. Dann haben wir die Update-Anweisung zusammengestellt und das Protokoll eingefügt (5 Protokolle für jede Daten). Die Netzwerkinteraktionszeit plus die Zeit zum Öffnen und Schließen der Datenbankverbindung, die Gesamtausführungszeit betrug etwa 10 Minuten. Die Verwendung von SQL-Anweisungen für Stapelverarbeitungsvorgänge kann die Effizienz um das 40-fache steigern, die Übertragung großer Datenmengen und die Anzahl der Datenbankverarbeitungszeiten sind jedoch zeitaufwändig. Daher geht es bei der Softwareentwicklung nicht nur darum, die Entwicklung abzuschließen, sondern auch darum, Leistungsprobleme zu lösen, was das fortgeschrittene Entwicklungsstadium darstellt. Vielen Dank fürs Lesen, ich hoffe, es kann Ihnen helfen, danke für Ihre Unterstützung dieser Site! Das könnte Sie auch interessieren:
|
<<: So erstellen Sie PHP7 mit einem benutzerdefinierten Docker-Image
>>: Mit JS in zehn Minuten die Existenz von Elementen in einem Array bestimmen
Im Front-End-Layoutprozess ist es relativ einfach...
Inhaltsverzeichnis Vorwort vue-cli 2.0 Version vu...
Inhaltsverzeichnis 1. Einleitung 2. Bereiten Sie ...
Dieses Mal haben wir einen RTMP-Liveübertragungss...
Hintergrund Heutzutage werden die Projekte des Un...
Code kopieren Der Code lautet wie folgt: Höhe: au...
Inhaltsverzeichnis 1. Was ist Dockerfile? 2. Anal...
Im vorherigen Artikel haben wir mit Timeouts unte...
Das letzte Update von Alibaba Cloud Disk ist scho...
Inhaltsverzeichnis Überblick Die Rolle des Revers...
Warum wird NULL so oft verwendet? (1) Javas Null ...
Inhaltsverzeichnis Überblick 1. Menü- und Routing...
Inhaltsverzeichnis 1. Vorstellen gemäß der Bestel...
Vorwort Ich glaube, dass viele Studenten bereits ...
Inhaltsverzeichnis 1. Gleichzeitige Zugriffskontr...