私の2つの質問は次のとおりです。
- クラスタ化インデックスを使用して、大きなテーブルへの一括挿入を高速化できますか?
- IDENTITY列がクラスター化インデックスではなくなった場合でも、外部キー関係を効率的に使用できますか?
詳細に説明すると、会社のデータを含む非常に大きな(100〜1000百万行の)テーブルがいくつかあるデータベースがあります。通常、このようなテーブルには20〜40の企業に関するデータがあり、それぞれが「CompanyIdentifier」(INT)でマークされた独自の「チャンク」です。また、すべての企業には約20の部門があり、それぞれに「DepartmentIdentifier」(INT)でマークされた独自の「サブチャンク」があります。
「チャンク」または「サブチャンク」全体がテーブルに追加またはテーブルから削除されることがよくあります。私が最初に考えたのは、これらのチャンクでテーブルパーティショニングを使用することでしたが、SQL Server 2008 Standard Editionを使用しているため、その資格がありません。それでも、私が持っているほとんどのクエリは、テーブル全体ではなく、「チャンク」または「サブチャンク」で実行されます。
私はこれらのテーブルを次の機能のために最適化するために取り組んできました:
- サブチャンクで実行されるクエリ
- テーブル全体で実行される「ベンチマーク」クエリ
- データの大きなチャンクの挿入/削除。
1)と2)については、私は多くの問題に遭遇していません。キーフィールド(有用な場合はCompanyIdentifierとDepartmentIdentifierも含む)にいくつかのインデックスを作成しましたが、クエリは正常に実行されています。
しかし、3)私は良い解決策を見つけるのに苦労しました。私の最初の戦略は、常にインデックスを無効にし、大きなチャンクを一括挿入し、インデックスを再構築することでした。これは最初は非常に高速でしたが、データベースに多くの企業が存在するようになったため、毎回インデックスを再構築するのに非常に長い時間がかかります。
現時点では、これがより高速になっているように見えるため、私の戦略は挿入中にインデックスをオンのままにすることに変更されました。しかし、挿入速度をさらに最適化したいと思います。
CompanyIdentifier + DepartmentIdentifierで定義されたクラスター化インデックスを追加することにより、テーブルへの新しい「チャンク」のロードが高速になることに気付いたようです。IDENTITY列にクラスター化インデックスを追加するためにこの戦略を放棄する前は、クラスター化インデックスは他のすべてのインデックスに含まれているため、クラスター化インデックスはできるだけ小さくする必要があると指摘されていました。しかし今、私はこの古い戦略を復活させてインサートをスピードアップすることを考えています。私の質問ですが、これは賢明なことでしょうか、それとも他の分野でパフォーマンスの低下に見舞われるのでしょうか?そして、これは本当に私の挿入をスピードアップしますか、それともそれは私の想像力ですか?
また、私の場合、IDENTITY列が本当に必要かどうかもわかりません。他のテーブルとの外部キー関係を確立できるようにしたいのですが、CompanyIdentifier + DepartmentIdentifier + [uniquifier]スキームのようなものを使用することもできますか?または、テーブル全体の断片化されたIDENTITY番号である必要がありますか?
提案や説明をありがとうございました。