1

Microsoft SQL Server を使用しています。再利用できるように、高価な計算を保存/キャッシュしたい。私の例では、ユーザーによって評価されたアイテムがあり、データベース スキーマは次のようになります。

User
 Id : int

Item
 Id : int

UserItemRating
 UserId (User)
 ItemId (Item)
 Rating : int

最高評価の項目を取得するには、各項目の平均評価を計算する必要があります (操作に費用がかかり、UserItemRating が頻繁に変更/更新されると仮定します)。この計算をキャッシュする良い方法は何ですか? 「AverageRating」列をアイテムに追加し、それを更新するトリガーを作成する必要がありますか? ビューを作成しますか? 計算を保持する一時テーブル?

4

1 に答える 1

3

SQL Server では、次のようなインデックス付きビューを作成します。

create view dbo.ItemRatings
with schemabinding
as
    select
        ItemId,
        COUNT_BIG(*) as Cnt,
        SUM(Rating) as TotalRating
    from
        dbo.UserItemRating
    group by
        ItemId
go
create unique clustered index IX_ItemRatings on dbo.ItemRatings (ItemId)

インデックス付きビューの作成と使用にはさまざまな制限がありますが、上記は有効です (スキーマUserItemRatingにあると仮定します)。dbo

注意事項:

  1. これはWITH SCHEMABINDING、テーブルを参照するために 2 つの部分からなる名前を使用する必要があることを意味します。
  2. COUNT_BIG()を使用できるようにするために使用する必要がありますGROUP BY
  3. 平均は直接含まれていません (実際、インデックス付きビューでは許可されていません)。ただし、をAVGで割ることで計算できます。SUM()COUNT_BIG()
  4. このビューでインデックスを利用するには、NOEXPANDヒントを使用してクエリを実行するか、Enterprise Edition 以上を実行する必要があります。

これがトリガー/テーブル ベースのソリューションよりも好まれるのはなぜですか? メンテナンスを実行するコードはSQL Server に組み込まれているため、他のソリューションよりも全体的なオーバーヘッドが少なくなります。(そして、それが正しいことを確認するために時間を費やす必要はありません)

Enterprise Edition を使用している場合、クエリで直接参照しなくても、このインデックス付きビューを利用することもできCOUNTます。索引。SUMAVG

于 2013-07-23T06:13:27.127 に答える