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 倍向上しますが、大量のデータの送信とデータベース処理回数には時間がかかります。 したがって、ソフトウェア開発は、開発を完了することだけではなく、開発の高度な段階であるパフォーマンスの問題を解決することも重要です。 読んでいただきありがとうございます。お役に立てれば幸いです。このサイトをサポートしていただきありがとうございます。 以下もご興味があるかもしれません:
|
<<: dockerカスタムイメージでphp7をビルドする方法
>>: JS を使用して配列内の要素の存在を 10 分で判断する
目次1. 画像1. 鏡とは何ですか? 2. 画像の構成と目的(1) Dockerファイル(2)スクラ...
序文:場合によっては、MySQL に接続されたセッションが異常終了することが多く、エラー ログに「通...
JavaScript では、警告ボックス、確認ボックス、プロンプト ボックスの 3 種類のメッセージ...
必要ページング バーを追加します。これにより、ページにジャンプしたり、ページ番号に従って特定のページ...
目次Vue でのスロットの使用: slotスコープ付きスロット: テンプレートタグで囲む要約するVu...
Dockerイメージのインポートとエクスポートこの記事では、移行、バックアップ、アップグレードなどの...
次のコマンドを使用してコンテナを作成し、ローカルの /home/dock/Downloads ディレ...
Linuxシステムでは、dockerを新しくインストールし、次のようなコマンドを入力します。dock...
<br />内容はインターネットから転載したものです。どこから見つけたのか忘れてしまいま...
背景アジャイル モデルは広く使用されており、テストは特に重要です。新しいバージョンは頻繁にリリースす...
目次Vueライフサイクルの紹介とフック機能VUEライフサイクルフックVue ライフサイクルの紹介作成...
現代の Web ビジュアル デザインは、初期の情報の積み重ねから、その後のグラフィックスと抽象化、そ...
フロントエンド開発では、Ajax、jQuery ajax、axios、fetch など、データ要求を...
日常の運用・保守作業では、nginx サービスが頻繁に使用され、nginx の高同時実行性によって生...
ビジネス上のニーズにより、急ぎの購入が発生することが多いため、ロード バランシング フロント エンド...