マルチテナントSaaSシステムの大きなテーブルのパフォーマンスを改善して、レポートをより高速にしようとしています。クラスタ化インデックスに列を追加すると、システムで挿入操作を行う時間が〜30msから1500〜2500msに増加しました!! この状況でこのテーブルに適用するのに最適なクラスター化インデックスオプションと非クラスター化インデックスは何ですか。
- データベース:SQL Azure
- このテーブルに対してINSERTとSELECTを実行するだけで、データは更新されません(UPDATE)
- 同時INSERTの高負荷(キューからデータを消費する異なるワーカーとスレッド)
- 100.000行/日(成長中)
- 実際には600万行(成長中)
- 各テナントは自分のIDのデータのみを読み取ります
- 1テナントには100〜3000のDeviceIdがあります
テーブル構造:
-TenantID(bigint)(smallintを使用できますが、将来Azureフェデレーションを使用する必要がある場合はbigintに変更しました)-DeviceID
(int)
-ReadID(bigint)(Identity)
-UIDRead(GUID)
-ReadDate (日時)
-SensorState1(tinyint)
-SensorState2(tinyint)
-SensorState3(tinyint)
...-
SensorState10(tinyint)
データの読み取りに使用される一般的なWHERE:
-WHERE DeviceId = @X and ReadDate Between @XDate and @YDate
-WHERE DeviceId IN(X、Y、Z)AND ReadDate Between @XDate and @YDate
-WHERE TenantId = @Y and ReadDate @XDateと@YDate
の間-WHERETenantId= @X AND DeviceID IN(X、Y、Z)AND ReadDate Between @XDate and @YDate
-WHERE TenantId = @X AND DeviceID = @ Y AND ReadDate Between @XDate and @YDate