設定
データウェアハウスでは、ファクトテーブルを20ディメンションに結合しています。ファクトテーブルには、3,200万行と30列があります。これは一時的なステージングテーブルなので、他のユーザーがテーブルを読み書きする必要はありません。ベーステーブルから10列、それぞれのディメンションから20列を選択します。ディメンションテーブルは小さい(3〜15.000行)。結合されるフィールドは、整数とnvarcharの両方です。SELECT ... INTOステートメントを使用しています。テーブルにインデックスはありません。
このクエリの実行速度は遅すぎるため、役に立ちません。
試してみたソリューション
クエリの処理に時間がかかりすぎるため、次の解決策を試しました。
- 20の結合を5つのテーブルの4つの結合に分割します。ただし、クエリのパフォーマンスは低いままです。
- 外部キー列にインデックスを配置します。時間の大幅な短縮はありません。
- 結合条件のフィールドが整数であることを確認してください。パフォーマンスが25%向上しました。私が探しているものではありません。
- select intoではなく、insert intoステートメントを使用します。データベースは単純復旧モードですが、ログファイルの増大によりパフォーマンスが低下します。
これらの調査結果から、コストの89%が表の挿入にあるという実際の実行計画を含めることにしました。その他のコストは、ファクトテーブルの8%のテーブルスキャンと、内部結合のハッシュマッチングの2%です。
ご質問
- 遅いテーブル挿入の考えられる理由は何ですか?
- 実行計画なしでこのボトルネックを特定する方法は何ですか?
- テーブル挿入のコストを削減するためにどのようなアクションを実行できますか?