私がいるところには、大規模な AIX メインフレームで実行されるメイン システムがあります。レポートと操作を容易にするために、メインフレームから SQL Server への夜間のダンプがあり、50 ほどのクライアントのそれぞれが同一のスキーマを持つ独自のデータベースに存在します。このダンプは、毎晩完了するのに約 7 時間かかります。これについて私たちができることは実際には何もありません。
SQL Server にダンプした後、それを使用して他の多くの日常的な手順を実行します。これらの手順の 1 つは、データを一種の管理レポート サンドボックス テーブルにインポートすることです。これは、さまざまなデータベースの特に重要なテーブルのレコードを 1 つのテーブルに結合し、SQL を知らない管理者がアドホック レポートを実行するために使用できるようにするものです。システムの残りの部分をホースアップする必要はありません。これもまた、ビジネス上の問題です。マネージャーはそれを望んでおり、私たちがそれを実装することを確認する権限を持っています。
このテーブルのインポート プロセスは、それだけで数時間かかります。50 のデータベースにまたがる約 4,000 万件のレコードを約 400 万件のレコードにフィルター処理し、検索用に特定の列にインデックスを付けます。数時間経ってもまだ初期ロードの 3 分の 1 未満ですが、夜間の処理の時間がなくなりつつあります。メインフレームのダンプは制御していませんが、これは制御しています。そのため、既存の手順を改善する方法を探す任務を負っています。
現在のところ、各クライアント データベースからすべてのデータをロードし、後で 1 つのステップでインデックスを作成する方が高速であるという考え方があります。また、長時間実行された場合に他の重要なシステムが停滞するのを回避するために、いくつかの大規模なクライアントが常に最初に実行されるように設定されています (テーブルのメイン インデックスは clientid フィールドによって決まります)。私たちが始めているもう 1 つのことは、各クライアントを順番にロードするのではなく、一度に数台のクライアントから同時にデータをロードすることです。
私の質問は、このテーブルをロードする最も効率的な方法は何でしょうか? 後で索引付けする方が良いと考えるのは正しいですか? それとも、データをインポートする前にインデックスを作成する必要がありますか? ページの大規模な並べ替えを避けるために、大きなクライアントを最初にロードするのではなく、インデックス順にテーブルをロードする必要がありますか? 並行してロードすると、一度に大量のディスク アクセスが発生したり、順序を制御する機能が失われたりして、事態が悪化する可能性はありますか? 他のアイデアはありますか?
更新
さて、何かが起きています。日中にいくつかのベンチマークを行うことができました。インデックスが操作の最初に作成されるか終了時に作成されるかにかかわらず、読み込み時間にまったく違いはありませんが、インデックス自体を構築する時間を節約できます (コースは、テーブルにデータがなくてもほぼ瞬時に構築されます)。