問題タブ [bulkupdate]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mysql - 大規模な InnoDB テーブルのインデックス付けされていない列への一括更新
Mysql 5.1 データベースに約 2,700 万行の InnoDB テーブルがあります。このテーブルにはmediumint unsigned
、定期的にグローバルに「0」にリセットできるようにしたいインデックスのない列が 3 つあります。例えば:
この非常に単純な更新クエリは、InnoDB の行レベル ロックの問題に直面しています。あまりにも多くの行をロックした後、更新クエリは十分に文書化されたエラーで失敗します:
問題は、このような大規模なテーブルでは、個々の行ロックの数が、ロックを格納するために割り当てられたスペースを超えていることです。
この問題に対処する方法について、いくつかの提案を見つけました。
テーブル全体をロックして行ロックをオフにする
これは最善かつ最もクリーンな解決策のように思えましたが、これらのまれな操作中にこの特定のテーブルが数分間ロックされても問題はありません。問題は、与えられた解決策が実際にはうまくいかなかったことです。多分それはMysqlの古いバージョンで動作するために使用されるものですか?
ロック バッファのサイズを
大きくする Mysql 変数の値を大きくすることで、innodb_buffer_pool_size
行ロックのためのスペースを増やすことができます。十分なスペースを割り当てることができたとしても、テーブルが大きくなると失敗する可能性があるため、このソリューションには非常に不快です。また、間違いなく不必要な数ギガバイトのロックを作成する必要がある、貧弱なセットアップのようです。
影響を受ける列にインデックスを付けます(コメントを参照)
適切なインデックスでサポートされている単一の列に対して一括更新を行う場合、InnoDB はすべての行のロックを回避できます。インデックスを使用することで、影響を受ける行のみをロックできます。実際にこれを試してみましたが、これら 3 つのインデックスを管理すると、増分更新が大幅に遅くなることがわかりました。カウントをリセットする必要があるすべてのインスタンスに対してこれら 3 つのカウントを調整する数千万の更新クエリがあるため、インクリメンタル更新の効率を犠牲にしたくありません。
バッチで列を更新する
ソース ドキュメントではこれを回避策として説明していますが、ある時点までは非常に効果的であることがわかりました。
影響を受ける行の数が指定された数より少なくなるまでこれを繰り返すことでlimit
、すべての行が更新されます。Mysqlが一致する行をさらに探す必要があるため、1回の反復で更新できる行の数が急激に減少するため、このソリューションは特に大きなテーブルではうまくいきませんでした。更新される 1,000 行が 1 回の実行には多すぎるまでに、何百万ものゼロ以外の値を更新する必要がありました。
では、私にはどのような可能性が残されているのでしょうか?
- InnoDB の使用をやめる: これには、現在のプロセスを再編成する必要がありますが、検討したいと思います。
- カウント列をメイン テーブルから移動する: CountA テーブルがある場合は、を使用してカウントをリセット
delete from CountA
し、メイン テーブルに対する内部結合を使用してカウントを取得できます。これにより、CountA テーブルの行を条件付きで更新または挿入する前に、メイン テーブルから ID を取得する必要があるため、個々のカウントの更新が遅くなります。素晴らしいことではありませんが、私が考慮したいことがあります。 - クリーンなソリューションであり、テーブルで適度に成長することが期待できる他のものはありますか?
更新: 受け入れられた応答の助けを借りて、約 5 分で作業を完了するバッチ処理の実装ができました。バッチ処理は必要ない方がいいと思いますが、より直接的な解決策が見つかるまでは必要なようです。次の人がこの質問につまずくのに役立つ場合に備えて、関連する Java JDBC コードを次に示します。(受け入れられた回答からリンクされたブログ投稿も読むことをお勧めします。)
sql - 列のコピーと更新と列の作成と挿入
PostgreSQL 9.2.10 に 3200 万行と 31 列のテーブルがあります。更新された値を持つ列を追加して、テーブルを変更しています。
たとえば、初期テーブルが次の場合:
結果が次のようになるようにテーブルを変更しています。
initial_color 列を読み取って値を更新するコードがあります。
テーブルに 3200 万行あり、31 列のうち 5 列にこの手順を適用する必要がある場合、これを行う最も効率的な方法は何ですか? 私の現在の選択肢は次のとおりです。
- 列をコピーし、新しい列の行を更新します
- 空の列を作成して新しい値を挿入する
一度に 1 つの列を使用するか、5 つすべてを一度に使用するかのいずれかのオプションを実行できます。列のタイプは または のいずれcharacter varying
かcharacter
です。
mongodb - MongoDB 複数の更新属性
次の形式のドキュメントを持つコレクション A があります。
およびドキュメント B の形式は次のとおりです。
コレクション A を更新して、次のようなドキュメントを作成したいと考えています。
現時点では、私は
、しかし、すべてのドキュメントに対してループで 10,000 回実行する必要があります。これらのような複数のドキュメントを (_id で) 1 回の db 呼び出しで、または最も効率的な方法で更新するにはどうすればよいですか? (これは基本的に結合/一括更新属性操作です)
私はmongodb 2.6を使用しています
duplicates - 複数の行の一意の列を更新し、重複をスキップします
これが私のメインテーブルです
ID -> 主キー列
モバイル -> 固有の列
新しい更新リクエストがあります。データは別のテーブルに存在します (たとえば、テーブルダミー)。
テーブル ダミーから Contacts にデータを更新するには、これら 2 つのテーブルを結合して更新クエリを簡単に起動し、連絡先のモバイルを更新します。ただし、ダミー テーブルの Mobile 列から更新されるデータが一意である場合にのみ可能です。
つまり、ダミーテーブルの内容が以下のような場合、
この場合、行 1 と 3 をスキップして、2 行目のみを更新します。そして、STATUS 列を更新する必要があります (Skipped または Updated)。
少ないクエリで可能ですか?
c# - ASP:ListView で一度にすべての挿入、更新、削除操作を一括で実装する方法
Web フォームのポップアップに表示されている Asp:ListView コントロールがあります。現在、Insert、Update、または Delete LinkButtons をクリックするとすぐに、すべての変更がデータベースで直接行われます。
しかし、すべての変更をデータベースで行う必要があるのは、Web フォームが送信されたときだけです。
したがって、私が考えたのは、セッションで ListView にバインドしているデータを保持し、すべての挿入、更新、および削除操作で、OnInserting、 OnDeleting
、OnUpdating イベントですべての変更を手動で行う必要があるということでした。
毎回 Session["ListView1"] からデータを取得し、
ステップ 2) 取得したデータに対して Insert/Delete/Update 操作を実行する
ステップ 3) それを ListView にバインドする
ステップ 4) 更新後に Session["ListView1"] 内のデータを置き換える
ステップ 5) Web フォームの送信時に、更新されたデータを取得し、データベース内のすべてを置換しますか?
これらの手順を実行しましたが、期待どおりに機能しません。更新時に、ListView は 2 つの列に空白の値を表示し、データを正しくバインドしません。正しい列にバインドしました。挿入後、TextBox は期待どおりにラベルに変更されません。以下は、私の ListView とコード ビハインド コードです。
リストビュー:
以下はコードビハインドです:
私は何を間違っていますか?助けてください。
どうもありがとう
sql - Postgres での一括更新
あるテーブル レコードを別のテーブル レコードに基づいて更新する必要があります。
私は試した
エラーが発生しています(MySQLとSQL Serverで同じクエリが機能します)。
次に、以下を試しました:
それは機能していますが、非常に遅いです。いくつかの大きなテーブルでも行う必要があります。
何か案は?
java - MS SQL 一括更新\挿入
しばらく前に、MS SQL データベースへの一括挿入/更新の問題に直面しました。
タスクは非常に単純で、DB からデータを取得し、データ変換を実行して親テーブルを更新し、子テーブルに入力するだけでした。データ量は膨大です。そのため、これを行うための最もパフォーマンスの高い方法に関心がありました。サードパーティのアプリケーションから情報を取得する必要があるため、DB ですべてを行う (ストアド プロシージャ、ファイル処理など) は適用されません。
インターネットでは、自動コミットを無効にしてバッチ挿入/更新を実行する方法に関する記事がたくさんありますが、とにかくリクエストを1つずつ送信します。これは、最も一般的な net.sourceforge.jtds.jdbc.Driver ( http://sourceforge.net/p/jtds/discussion/129584/thread/8e89906c/ ) を含む、多数の無料の jdbc ドライバーに適用されます。おそらく DataDirect はそのような機能をサポートしていますが、無料ではありません。FIY - SQL Server 2008 用の JDBC ドライバーのリスト (比較)。
同様の問題を解決した経験を共有してください。
宜しくお願いします、
アレックス
java - Elasticsearch Java一括アップサート例外
一括 API を使用して既存のインデックスを一括更新しようとしています。そのため、更新が必要な既存のレコードと、存在しないためインデックスを作成する必要がある新しいレコードがあります。次のコードを使用しました
ただし、これにより、次の例外が発生します
新しいレコード/新しい docIds が失敗した場所だと推測しています。upsert (存在する場合は更新、存在しない場合は挿入) をまとめて達成する方法はありますか?