web-dev-qa-db-ja.com

SQL-Serverでのマルチテナントデータのパーティション分割に関する推奨事項

マルチテナントのビジネスアプリケーションを分割する(または分割しない)ための設計上の考慮事項について、ご意見をお寄せください。すべてのデータテーブルは、次のような複合キーを使用します。

CREATE TABLE SomeTable(
  TenantId SMALLINT NOT NULL,
  ID INT NOT NULL,
  SomeData ...,
  CONSTRAINT [PK_SomeTable] PRIMARY KEY CLUSTERED (TenantID, ID)
)

ほとんどすべての読み取りは、特定のテナントにキー付けされます。書き込みはtenantIDによってランダムに行われますが、3〜5日間配置されたデータはその後は変更されない傾向があります。

ご質問

  1. パーティションを設定しない場合は、(tenantID、id)または(id、tenantid)の方が適しています。読み取りはすべてテナントIDで行われ、書き込みはテナントIDでランダムであり、メンテナンスプランを実行するのに十分なダウンタイムが毎晩あると想定します。
  2. 各tenantIDに個別のパーティションを作成することの長所と短所は何ですか?
  3. TenantIDが最初のキーである場合、パーティションはページの断片化を減らしますか?
  4. パーティションがプライマリファイルにある場合、引数は変更されますか?
  5. パーティションが10または1000ある場合、引数は変更されますか?
  6. 答えはSQL 2016とSQL Azureのどちらを使用しているかによって異なりますか?
5
cyriously

パーティションを設定しない場合は、(tenantID、id)または(id、tenantid)の方が適しています。読み取りはすべてテナントIDで行われ、書き込みはテナントIDでランダムであり、メンテナンスプランを実行するのに十分なダウンタイムが毎晩あると想定します。

(tenantID、id)は、各テナントのデータのローカリティを作成するため、より良い順序です。

各tenantIDに個別のパーティションを作成することの長所と短所は何ですか?

メリット:パーティション操作を使用して、単一のテナントを操作できます。たとえば、SWITCH、TRUNCATE、REBUILDなどです。

短所:メンテナンス、および新しいテナントを追加するためのパーティション分割のコスト。

しかし参照してください:

TenantIDが最初のキーである場合、パーティションはページの断片化を減らしますか?

いいえ。各テナントの行は、インデックス内で論理的およびほとんど物理的に隣接しています。基本的に、テナントごとに1つまたはいくつかのフラグメントがあります。したがって、パーティショニングにより断片化が軽減されますが、パーティショニングがなければ問題にはなりません。

パーティションがプライマリファイルにある場合、引数は変更されますか?

いいえ、それは別です。それらを分離する正当な理由がない限り、すべてのパーティションは単一のファイルグループに移動する必要があります。いくつかの特別なテナント用に個別のファイルグループを作成することもできますが、お勧めしません。

パーティションが10または1000ある場合、引数は変更されますか?

いいえ、ただし、パーティションに関するメインテナンスの問題が悪化します。

答えはSQL 2016とSQL Azureのどちらを使用しているかによって異なりますか?

番号。

ただし、後退して、テナントデータを保持する複数のフェデレーションデータベースを計画する必要があります。マルチテナントデータベースの設計を引き続き使用できますが、最終的にはマルチテナントデータベースとシングルテナントデータベースが混在することになります。データベースでテナントを分離することには、多くの重要な利点があります。

  1. テナントデータは分離されています。これは顧客への販売において重要であり、テナントがお互いのデータを決して見ることができないようにすることを非常に簡単にします。
  2. テナントを個別にアップグレードしてパッチを適用できます。
  3. テナントを一度に無料で移動、バックアップ、復元、エクスポートすることができます。重要な点として、これにより、単一テナントのポイントインタイムリストアが可能になります。
  4. データベースは実際のセキュリティ境界であり、ユーザーが単一のテナントのデータのみを表示できるようにすることができます。
  5. テナントを別のデータベースに移動するために、テナントエクスポートおよびテナントインポートプロセスを作成する必要はありません。
  6. テナントを個別にスケーリングして、大規模または主要なテナントにサーバーリソースへの差別化されたアクセスを提供したり、独自の専用リソースを提供したりすることもできます。これにより、ソリューションの管理が容易になり、リスクが軽減され、価格設定の機会が生まれます。
  7. 各テナントは独自のクエリプランキャッシュを取得するため、大規模なテナントのデータのクエリに使用される小規模なテナント用に最適化されたクエリプランはありません。また、各テナントのパフォーマンスメトリックを確認できます。