データウェアハウスでは、ファクトテーブルを20ディメンションに結合しています。ファクトテーブルには、3,200万行と30列があります。これは一時的なステージングテーブルなので、テーブルの読み取りや書き込みを行う他のユーザーに対処する必要はありません。ベーステーブルから10列、それぞれのディメンションから20列を選択します。ディメンションテーブルは小さい(3〜15.000行)。結合されるフィールドは、整数とnvarcharの両方です。 SELECT ... INTOステートメントを使用しています。テーブルにインデックスはありません。
このクエリの実行速度は遅すぎるため、役に立ちません。
クエリの処理に時間がかかりすぎるため、次の解決策を試しました。
これらの調査結果から、コストの89%がtable insertにあることを示す実際の実行計画を含めることにしました。その他のコストは、ファクトテーブルの8%のテーブルスキャンと、内部結合のハッシュマッチングの2%です。
遅いテーブル挿入の考えられる理由は何ですか?実行計画なしでこのボトルネックを特定する方法は何ですか?
SQL Serverのパフォーマンスを分析する方法 、特に 個々のクエリ実行待機時間の分析 に関する部分をお読みください。
テーブル挿入のコストを削減するためにどのようなアクションを実行できますか?
それは、パフォーマンス分析の結果に大きく依存します。まず第一に、[〜#〜] select [〜#〜]部分が可能な限り高速であることを確認します。問題がシングルスレッドの完全にログに記録された挿入であると仮定すると、いくつかの解決策は次のとおりです。
パーティションスイッチを使用してデータを移動します。これは、断然、最善の解決策です。別のステージングテーブルにステージングデータを準備してから、このステージングテーブルをDWテーブルに切り替えます。読み取り パーティション切り替えを使用してデータを効率的に転送する 。
INSERTが最小限のログに記録されていることを確認してください。 最小限のログを取ることができる操作 および 最小限のログを取るための前提条件 をお読みください。パーティションスイッチ操作を使用する場合でも、ステージングテーブルのビルドが最小限のログに記録されることを確認する価値があります。
IOサブシステムが高速の負荷を駆動できることを確認してください。 SSDの紹介 をお読みください。
以下は私の経験であり、他の誰かを助けるかもしれません。
あるデータベースから別のデータベースにデータを転送しようとしていて、途中でいくつかの変換も行っていました。多くの挿入を実行していた変換をテストし、途中で修正してから、挿入を再度テストするために削除しました。ただし、いくつかの挿入と切り捨ての後、クエリの実行が遅くなり、1つの単純な挿入が以前は約3分間実行されていたのに、最大で9分間かかりました。
したがって、これらの2つの戦略を試して、これがどのように機能するかを確認してください。