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 分で判断する
この記事では、絵文字用の MySQL Java サーバーのサポートと問題解決方法について説明します。...
エラーを報告するApache\Nginx サービスは正常に起動しましたが、MySQL は起動に失敗し...
Ansible は、Python をベースに開発された新しい自動運用・保守ツールです。 多くの古い運...
目次CURRENT_TIMESTAMPの使用CURRENT_TIMESTAMPを使用したタイムスタン...
目次序文vue-cli 2.0 バージョンvue-cli 3.0 バージョン要約する序文vue-cl...
目次1. Bootstrap5 ブレークポイント1.1 モバイルファースト1.2 ブートストラップブ...
目次移行ツールアプリケーション変換mysql8.0 ドライバ パッケージを追加データソース構成の変更...
最近、 Three.jsでReactを使用して、720 度のパノラマ写真を閲覧できるプロジェクトを構...
まず問題の説明から始めましょう:同じページで、1 つのタブに float:left が必要で、もう ...
1. mysqldump の紹介mysqldump は、MySQL に付属する論理バックアップ ツー...
この記事は主に、以前のインストール方法を使用して MySQL 5.7.14 をインストールするときに...
1. Tomcatのインストールパスを作成する mkdir /usr/local/tomcat 2....
目次1. はじめに2. インターフェース3. 簡単な例4. 結論1. はじめにMDN の公式 Web...
目次概要コンポーネント間でデータを共有する方法Vuex の原則の紹介Vuexはコンポーネントのグロー...