2011-11-16 9 views
3

私はアプリケーション用のマルチテナントDBを作成しています。私はすべてのテーブルのアプローチでTenantIDに行って、それは非常にうまく動作します。私はパフォーマンスチューニング段階にいます。マルチテナントDBのテナントIDのインデックス付け

私の質問は、データベースのすべてのクエリがこの列をフィルタリングするので、最適化された検索のために各テーブルの各インデックスにインデックスを付ける必要がありますか?

助言を受けてください。あなたはインデックスを作成するときにする必要があり、多くの考慮事項がありますが

おかげ

+1

これは、テナントIDがすべてのテーブルに対してFKではないため、デフォルトでFKであるというインデックスですか? – xQbert

答えて

5

は、私の経験では、(ユニーク)クラスタ化インデックスは、すべてのPKクエリが複合キーに探すことができますtenantId + PKとしてうまく機能します。

これには、非クラスタ化インデックスのテーブルへの参照としてSQL Serverがクラスタ化キーを参照として使用するため、非クラスタ化インデックスにtenantIDを追加するという利点があります。

挿入がほぼ常に中間ページになるので注意してください。このアプローチでは、読み込みを最適化することは間違いありません。塗りつぶし係数を70とし、フラグメンテーションを見て、定期的なインデックスメンテナンスを確実にしてください(これはとにかく必要です)

最高の運があります。

+0

ユニークなクラスタリングインデックスでは、現在のプライマリキーとテナントIDから構成される複合プライマリキーを持つように各テーブルを設定することを意味しますか?または、カスタム・クラスタリング索引を表に設定することを意味しますか? – Matt

+0

あなたはどちらにでも行くことができます。私はあなたがアイデンティティなどをテーブルの主キーとして持っていると仮定しています。その場合、技術的にはテナントIDは主キーの一部ではなく、すでにFKを設定している場合は複合キーを作成するのが難しい場合があります。私が最後にこのルートを辿ったのは、tenantidとID列の固有のクラスタード・インデックスと、ID列の非クラスター化された主キーを作成することでした。現在、あなたのテーブルスキーマは何ですか? –

+1

私が同意すると、 'tenantId'はすべてのクラスタード・インデックス・キーの一番左の列になり、すべての述部と結合には' tenantId'が含まれていなければなりません。 –

0

デザインのマルチテナント性を利用するすべてのクエリでは、tenantIdを含むインデックスが必要です。問題は、インデックス構造がどこでテナントが発生するかです。もちろん答えはそれに依存します。最大の選択性を持つフィールドが最初に来るようにインデックスを構築してみてください。

たとえば、状態(50)とテナント10の均等分布を持つテーブルを想定して、私はState、TenantIdというインデックスを作成します。 1000人のテナントと同じテーブルのためにTenantIdというインデックスを作成してからStateを作成します。

実際には両方のインデックスが便利です(オプティマイザで並べ替えます)。

関連する問題