MySql-Batch-Insert-Optimierung. Beispiel für SQL-Ausführungseffizienz. Detaillierte Erklärung

MySql-Batch-Insert-Optimierung. Beispiel für SQL-Ausführungseffizienz. Detaillierte Erklärung

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:
  • Beispiele für 4 Methoden zum Einfügen großer Datenmengen in MySQL
  • MySQL-Batch-Einfügungsdaten-Implementierungscode
  • Tutorial zur Implementierung von Batch-Einfügungen in MySQL zur Leistungsoptimierung
  • So vermeiden Sie MySQL-Batch-Einfügungen mit eindeutigen Indizes
  • Mysql verwendet Einfügen, um mehrere Datensätze einzufügen und Daten stapelweise hinzuzufügen
  • Detaillierter Beispielcode einer MySQL-Batch-Einfügeschleife
  • MySQL-Batch-Einfügen von Datenskript
  • Detaillierte Erläuterung der Leistungsoptimierung für MySQL-Batch-SQL-Einfügungen
  • MySQL fügt Daten im Batch über gespeicherte Funktionsprozeduren ein

<<:  So erstellen Sie PHP7 mit einem benutzerdefinierten Docker-Image

>>:  Mit JS in zehn Minuten die Existenz von Elementen in einem Array bestimmen

Artikel empfehlen

Vue3 setup() - Erweiterte Verwendungsbeispiele - ausführliche Erklärung

Inhaltsverzeichnis 1. Unterschiede zwischen Optio...

Zusammenfassung der Benutzererfahrung

Unabhängig davon, ob Sie an Software oder Websites...

Installations- und Nutzungsprotokoll von VMware ESXi (mit Download)

Inhaltsverzeichnis 1. Installieren Sie ESXi 2. ES...

Eine kurze Erläuterung des Lazy-Loading-Attributmusters in JavaScript

Inhaltsverzeichnis 1. Einleitung 2. On-Demand-Att...

Eine kurze Zusammenfassung von Vue Keep-Alive

1. Funktion Wird hauptsächlich verwendet, um den ...

Detaillierte Einführung in Protokolle im Linux-System

Inhaltsverzeichnis 1. Logbezogene Dienste 2. Geme...

CSS realisiert die Layoutmethode „Fest links“ und „Adaptiv rechts“

1. Schwebendes Layout 1. Lassen Sie zuerst das Di...

Einige Tipps zum Website-Design

Tatsächlich haben wir in letzter Zeit viel über W...

MySQL wählt die richtige Speicher-Engine

Wenn es um Datenbanken geht, ist eine der am häuf...