私はオラクルが初めてで、この問題と戦わなければなりません。
内部に約 5 億 2000 万行のテーブルがあります。すべての行をフェッチし、NoSQL データベース内にインポート (非正規化) する必要があります。
このテーブルには、C_ID と A_ID の 2 つの整数フィールドと、C_ID に 1 つ、A_ID に 1 つ、両方のフィールドに 1 つの 3 つのインデックスがあります。
私は最初にこの方法を試しました:
SELECT C_ID, A_ID FROM M_TABLE;
そして、これは妥当な時間内に結果をもたらしたことはありません(完了しないように見えたため、時間を測定する可能性がありませんでした)。
クエリを次のように変更しました。
SELECT /*+ ALL_ROWS */ C_ID, A_ID FROM (SELECT
rownum rn, C_ID, A_ID
FROM
M_TABLE WHERE rownum < ((:1 * :2 ) +1 )) WHERE rn >= (((:1 -1) * :2 ) +1 );
3 つのスレッドを使用し、サイズ 1000 のページを使用してページネーションを使用して、このクエリを並行して実行します。
3 つの最適化を導入しようとしました。
1)テーブルの統計を作成しました:
ANALYZE TABLE TABLE_M ESTIMATE STATISTICS SAMPLE 5 PERCENT;
2) テーブルを 8 つのパーティションに分割しました。
3) 並列オプションでテーブルを作成しました。
現在、1 秒あたり 10000 行をフェッチできるため、プロセス全体が完了するまでに約 15 時間かかります (DB は 4 コア、8 GB マシンで実行されています)。
問題は、最大 5 時間ですべてを完了する必要があることです。
私にはアイデアがありません。そのため、新しいマシンを要求する前に、このような状況でパフォーマンスを向上させる方法をご存知ですか。