1

私がいるところには、大規模な AIX メインフレームで実行されるメイン システムがあります。レポートと操作を容易にするために、メインフレームから SQL Server への夜間のダンプがあり、50 ほどのクライアントのそれぞれが同一のスキーマを持つ独自のデータベースに存在します。このダンプは、毎晩完了するのに約 7 時間かかります。これについて私たちができることは実際には何もありません。

SQL Server にダンプした後、それを使用して他の多くの日常的な手順を実行します。これらの手順の 1 つは、データを一種の管理レポート サンドボックス テーブルにインポートすることです。これは、さまざまなデータベースの特に重要なテーブルのレコードを 1 つのテーブルに結合し、SQL を知らない管理者がアドホック レポートを実行するために使用できるようにするものです。システムの残りの部分をホースアップする必要はありません。これもまた、ビジネス上の問題です。マネージャーはそれを望んでおり、私たちがそれを実装することを確認する権限を持っています。

このテーブルのインポート プロセスは、それだけで数時間かかります。50 のデータベースにまたがる約 4,000 万件のレコードを約 400 万件のレコードにフィルター処理し、検索用に特定の列にインデックスを付けます。数時間経ってもまだ初期ロードの 3 分の 1 未満ですが、夜間の処理の時間がなくなりつつあります。メインフレームのダンプは制御していませんが、これは制御しています。そのため、既存の手順を改善する方法を探す任務を負っています。

現在のところ、各クライアント データベースからすべてのデータをロードし、後で 1 つのステップでインデックスを作成する方が高速であるという考え方があります。また、長時間実行された場合に他の重要なシステムが停滞するのを回避するために、いくつかの大規模なクライアントが常に最初に実行されるように設定されています (テーブルのメイン インデックスは clientid フィールドによって決まります)。私たちが始めているもう 1 つのことは、各クライアントを順番にロードするのではなく、一度に数台のクライアントから同時にデータをロードすることです。

私の質問は、このテーブルをロードする最も効率的な方法は何でしょうか? 後で索引付けする方が良いと考えるのは正しいですか? それとも、データをインポートする前にインデックスを作成する必要がありますか? ページの大規模な並べ替えを避けるために、大きなクライアントを最初にロードするのではなく、インデックス順にテーブルをロードする必要がありますか? 並行してロードすると、一度に大量のディスク アクセスが発生したり、順序を制御する機能が失われたりして、事態が悪化する可能性はありますか? 他のアイデアはありますか?

更新
さて、何かが起きています。日中にいくつかのベンチマークを行うことができました。インデックスが操作の最初に作成されるか終了時に作成されるかにかかわらず、読み込み時間にまったく違いはありませんが、インデックス自体を構築する時間を節約できます (コースは、テーブルにデータがなくてもほぼ瞬時に構築されます)。

4

4 に答える 4

1

最後にインデックス、はい。また、トランザクション ログへの書き込みを最小限に抑えるために、ログ レベル設定を BULK LOGGED に設定することも検討してください。終了したら、忘れずに FULL に戻してください。

于 2008-10-22T19:43:16.297 に答える
1

ライブ インデックスはデータベース内のすべての行に対して複数の I/O を生成するため、インデックスを削除してロードする方が適切です。400 万行は十分に小さいため、テーブルのパーティション化による大きなメリットは期待できません。

bcp を使用してデータをステージング領域にロードし、いくつかのタスクを並行して実行することで、パフォーマンスを向上させることができます (SSIS はこれを行います)。ファイル パス (および必要に応じてテーブル名) を受け取る bcp 用の汎用バッチ ファイル ラッパーを作成し、SSIS の「プロセス実行」タスクを使用して一連のジョブを半ダースのスレッドで呼び出します。50 個のジョブの場合、データ駆動型のロード コントローラー プロセスを作成しようとする価値はおそらくありません。これらのタスクをシーケンス コンテナーにまとめて、すべての依存関係を明示的に維持する必要がないようにします。

プロセス中の I/O の量が大幅に削減されるため、必ずインデックスを削除して再作成する必要があります。

50 個のソースが同じように扱われている場合は、それらを共通のテーブルにロードするか、ステージング テーブルに分割されたビューを構築してみてください。

于 2008-10-22T15:18:47.967 に答える
1

私は SQL Server に大量のデータ セットをロードする作業をかなり行ってきました。また、挿入時とその後の追加時に、インデックスのパフォーマンス テストを行いました。すべてのデータがロードされた後にインデックスを作成する方がはるかに効率的であることがわかりました。私たちの場合、最後に追加されたインデックスでロードするのに 1 時間かかり、インデックスがまだオンになっている状態で追加するのに 4 時間かかりました。

重要なのは、データをできるだけ早く移動することだと思います。順番にロードすることが本当に役立つかどうかはわかりません。ロード時間とインデックス時間の統計はありますか? もしそうなら、物事のその側で少し実験を始めることができます.

于 2008-10-22T14:37:04.837 に答える
0

私の知る限りでは、あなたは正しいです。一度にすべてのレコードを追加してから、最後に一度インデックスを作成する方がはるかに優れています。

于 2008-10-22T14:33:48.760 に答える