MySql バッチ挿入の最適化 SQL 実行効率の例の詳細な説明

MySql バッチ挿入の最適化 SQL 実行効率の例の詳細な説明

MySql バッチ挿入の最適化 SQL 実行効率の例の詳細な説明

itemcontractprice の数は 10,000 程度で、itemcontractprice ごとに 5 つのログが挿入されます。

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( "ITEMS" ITEMCONTRACTPRICELOG`( `ContractPriceType`、` ContractPrice`、 `fccontractPrice`、` sexpire`、 `logremark`、` recreatedbyname`、 `createdbyid`、` recreateddate`、 `regtyid`、` rogtypeid`、 `、` regtypeid」 「CurrencyId」、 `ContractPriceid`、 `Stockpattern`、` itemid`)select 0、c.remainprice、f.remainprice、c.remainisexpire、 '外币汇率调整、'、 'job'、0、now() c.foreigncurrencyId = f.contractpriceidのf.currencyId = {0}とc.date '{1:yyyy-mm-dd}'と '{2:yyyy-mm-dd}'; "、endycangerate.currencyid、rate.begindate、rate.endte); 
 
updateInsertsql.AppendFormat( "ITEMS" ITEMCONTRACTPRICELOG`( `ContractPriceType`、` ContractPrice`、 `fccontractPrice`、` sexpire`、 `logremark`、` recreatedbyname`、 `createdbyid`、` recreateddate`、 `regtyid`、` rogtypeid`、 `、` regtypeid」 「CurrencyId」、 `ContractPriceid`、 `stockpattern`、` itemid`)select 1、c.buyoutprice、f.buyoutprice、c.buyoutisexpire、 '外币汇率调整、重新计算人民币底价'、 'job'、0、now()、5、c foreigncurrencyid = f.contractpriceid where c.currencyid = {0}とc.date '{1:yyyy-mm-dd}'と '{2:yyyy-mm-dd}'; "、endcangerate.currencyid、rate.begindate、rate.endte); 
 
updateInsertsql.AppendFormat( "ITEMS" ITEMCONTRACTPRICELOG`( `ContractPriceType`、` ContractPrice`、 `fccontractPrice`、` sexpire`、 `logremark`、` recreatedbyname`、 `createdbyid`、` recreateddate`、 `regtyid`、` rogtypeid`、 `、` regtypeid」 「CurrencyId」、 `ContractPriceid`、 `stockpattern`、` itemid`)select 2、c.ReservedPrice、c.ReserveDisexpire、 '外币汇率调整、'、 'job'、0、now() f on C.ForeignCurrencyId = f.ContractPriceid WHERE C.CURRENCYID = {0}とc.date '{1:yyyy-mm-dd}'と '{2:yyyy-mm-dd}'; "、exchangerate.currencyid、rate.begindate、rate); 
 
updateInsertsql.AppendFormat( "ITEMS" ITEMCONTRACTPRICELOG`( `ContractPriceType`、` ContractPrice`、 `fccontractPrice`、` sexpire`、 `logremark`、` recreatedbyname`、 `createdbyid`、` recreateddate`、 `regtyid`、` rogtypeid`、 `、` regtypeid」 「CurrencyId」、 `ContractPriceid`、 `Stockpattern`、` itemid`)select 3、c.collectedprice、c.collectedisexpire、 '外币汇率调整、'、 'job'、0、now()、5、c.providerid、c.priced、c.date、c c.foreigncurrencyId = f.contractpriceidのf.currencyId = {0}とc.date '{1:yyyy-mm-dd}'と '{2:yyyy-mm-dd}'; "、endycangerate.currencyid、rate.begindate、rate.endte); 
updateInsertsql.AppendFormat( "ITEMS" ITEMCONTRACTPRICELOG`( `ContractPriceType`、` ContractPrice`、 `fccontractPrice`、` sexpire`、 `logremark`、` recreatedbyname`、 `createdbyid`、` recreateddate`、 `regtyid`、` rogtypeid`、 `、` regtypeid」 「CurrencyId」、 `contractPriceid`、 `stockpattern`、` itemid`)select 4、c.accessprice、f.accessprice、c.accessisexpire、 '外币汇率调整、'、 'job'、0、now() c.foreigncurrencyId = f.contractpriceidのf.currencyId = {0}とc.date '{1:yyyy-mm-dd}'と '{2:yyyy-mm-dd}'; "、endycangerate.currencyid、rate.begindate、rate.endte); 
//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) 続行します。 
int 効果行 = 0; 
(var tran = UnitOfWorkManager.Begin()) を使用します 
{ 
  effctRows = taskRepository.ExecuteSql(updateInsertSql.ToString(), false); 
  tran.Complete(); 
} 
logger.InfoFormat("最低入札価格の更新によって影響を受ける行数: {0}", effctRows); 

通常は約20秒かかります。

以前は、クエリに EF を使用していましたが、時間がかかりました。その後、更新ステートメントを組み立てて、ログを挿入しました (データごとに 5 つのログ)。ネットワークのやり取りの時間とデータベース接続を開いて閉じる時間を加えた合計実行時間は約 10 分でした。

バッチ操作に SQL ステートメントを使用すると、効率が 40 倍向上しますが、大量のデータの送信とデータベース処理回数には時間がかかります。

したがって、ソフトウェア開発は、開発を完了することだけではなく、開発の高度な段階であるパフォーマンスの問題を解決することも重要です。

読んでいただきありがとうございます。お役に立てれば幸いです。このサイトをサポートしていただきありがとうございます。

以下もご興味があるかもしれません:
  • MySQL に大量のデータを挿入する 4 つの方法の例
  • MYSQL バッチ挿入データ実装コード
  • MySQL でバッチ挿入を実装してパフォーマンスを最適化するチュートリアル
  • ユニークインデックスを使用したMySQLバッチ挿入を回避する方法
  • MySQLは挿入を使用して複数のレコードを挿入し、データを一括で追加します。
  • MySQL バッチ挿入ループの詳細なサンプルコード
  • MySQL バッチデータ挿入スクリプト
  • MySQL バッチ SQL 挿入パフォーマンス最適化の詳細な説明
  • MySQLバッチは関数ストアドプロシージャを通じてデータを挿入します

<<:  dockerカスタムイメージでphp7をビルドする方法

>>:  JS を使用して配列内の要素の存在を 10 分で判断する

推薦する

Vueはグラフィック検証コードを実装する

この記事の例では、グラフィック検証コードを実装するためのVueの具体的なコードを参考までに共有してい...

HTML5+CSS3 ヘッダー作成例と更新

前回、私たちは 2 つのヘッダー レイアウト (フレックスボックス 1 つとフロート 1 つ) を考...

Dockerイメージをプルしてバージョンを確認する方法

イメージのバージョンとタグを確認するには、docker hubで確認する必要があります。アドレスは次...

JavaScriptオフセットは、ウィンドウ内でのマウス座標の取得とモジュールのドラッグを実装します。

オフセットOffset はオフセットです。関連プロパティの offset シリーズを使用すると、次の...

JS における for、for...in、for...of、forEach の違いと使用例

forループ基本的な構文形式: for(変数の初期化; 条件式; 演算式){ループ本体ステートメント...

Vue で ToDo アプリケーションを実装する例

背景まず最初に、私はフロントエンド開発の専門家ではないことを述べておきたいと思います。私の以前のコン...

HTML 順序なしリスト 箇条書き 画像を使用した CSS の記述

少なくとも 5 冊のベストセラー書籍の順序なしリストを含む HTML ページを作成します。各書籍の前...

MySQL の重要なパフォーマンス インデックスの計算と最適化方法の概要

1 QPS 計算 (1 秒あたりのクエリ数) MyISAMエンジンベースのDBの場合 MySQL&g...

MySQL データベース監視ソフトウェア lepus の使用上の問題と解決策

lepus3.7 を使用して MySQL データベースを監視中に、次の問題が発生しました。このブログ...

Windows で MySQL 5.6 を 5.7 にアップグレードする方法

前面に書かれたMySQL をアップグレードする方法には、インプレース アップグレードと論理アップグレ...

Reactプロジェクトの新規作成からデプロイまでの実装例

新しいプロジェクトを始めるこの記事では主に、新規プロジェクトを0から1まで取り組むプロセスを記録し、...

HTMLでカメラを読み込む方法

効果図: 全体的な効果: ビデオ読み込み中: 写真:ステップ1: HTML要素を作成するまず、HTM...

MySQL テーブルがロックされているかどうかを照会する方法

具体的な方法: (推奨チュートリアル:MySQLデータベース学習チュートリアル)テーブルロックの状態...

DockerでのinfluxDB分散時系列データベースのインストールと関連操作について簡単に説明します。

influxDB の紹介influxDB は分散型時系列データベースです。 cAdvisor はリ...

MySQL クエリ キャッシュのグラフィカルな説明

目次1. 原則の概要クエリキャッシュシステム変数1. クエリキャッシュを持つ2. クエリキャッシュ制...