5億行のテーブルがある(そして成長している)
挿入のパフォーマンスを向上させるために次のことを行いました。
データベース側:
- すべてのインデックスと制約を削除
- ロギングを無効化
アプリケーション側:
- JPA管理エンティティからネイティブ挿入クエリに切り替え、クエリにAPPEND Oracleヒントを追加
- 1k / 2k / 3k行ごとにバッチでコミットしようとしました
- 1つのテーブルに並列に(複数のスレッド、スレッド数=サーバーのコア数に)書き込もうとした
これは私に毎秒約300行を与えました
さらに試しました:
- 複数のテーブルにバッチで並行して書き込む(UNIONを使用して結果をグループ化して戻す)
これにより、1秒あたり約1k行が得られましたが、空のテーブルにあります。しかし、テーブルにダミーデータ(それぞれ2億個)を入力すると、挿入速度が1秒あたり250〜300に低下しました。
誰かが挿入を高速化するために他に何ができるかを提案できますか?基本的に私は最初にボトルネックが何であるか(何であるか)を理解したいと思います。
UPD: テーブルは挿入日によってパーティション化され、テーブルには約60列があります-ほとんどの列はVARCHAR2(2000 BYTE)です
/*+APPEND*/
単一行の挿入では、ヒントは無視されます(INSERT INTO ... SELECT
追加する必要がない場合)。(3)direct=true
@parsifalによって提案されたベースラインを確立するために、SQL * Loaderの例をセットアップする必要があります。