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 分で判断する
この記事の例では、グラフィック検証コードを実装するためのVueの具体的なコードを参考までに共有してい...
前回、私たちは 2 つのヘッダー レイアウト (フレックスボックス 1 つとフロート 1 つ) を考...
イメージのバージョンとタグを確認するには、docker hubで確認する必要があります。アドレスは次...
オフセットOffset はオフセットです。関連プロパティの offset シリーズを使用すると、次の...
forループ基本的な構文形式: for(変数の初期化; 条件式; 演算式){ループ本体ステートメント...
背景まず最初に、私はフロントエンド開発の専門家ではないことを述べておきたいと思います。私の以前のコン...
少なくとも 5 冊のベストセラー書籍の順序なしリストを含む HTML ページを作成します。各書籍の前...
1 QPS 計算 (1 秒あたりのクエリ数) MyISAMエンジンベースのDBの場合 MySQL&g...
lepus3.7 を使用して MySQL データベースを監視中に、次の問題が発生しました。このブログ...
前面に書かれたMySQL をアップグレードする方法には、インプレース アップグレードと論理アップグレ...
新しいプロジェクトを始めるこの記事では主に、新規プロジェクトを0から1まで取り組むプロセスを記録し、...
効果図: 全体的な効果: ビデオ読み込み中: 写真:ステップ1: HTML要素を作成するまず、HTM...
具体的な方法: (推奨チュートリアル:MySQLデータベース学習チュートリアル)テーブルロックの状態...
influxDB の紹介influxDB は分散型時系列データベースです。 cAdvisor はリ...
目次1. 原則の概要クエリキャッシュシステム変数1. クエリキャッシュを持つ2. クエリキャッシュ制...