もう1つの選択肢は、voteVolderとして投票を集計する投票表のビューを作成することです。 次に、ビューのインデックスを作成します。
SQL Serverオプティマイザの魔法(エンタープライズ版のみだと思います)は、sum(voteColumn)のクエリを見ると、同じデータのビューのインデックスからその値を選ぶことになりますクエリで直接ビューを参照していないと考えてください。
エンタープライズエディションをお持ちでない場合は、テーブルではなくビューの投票総数を照会し、インデックスを利用することができます。
インデックスは、基本的に、オプティマイザが認識しているデータの非正規化です。必要に応じて作成または削除し、オプティマイザが把握できるようにします(コードを変更する必要はありません)。手作業で作成された非正規化のパスを開始すると、コードに数年間保存されます。
チェックアウトImproving performance with indexed views
作業インデックス付きビューを取得するために満たされなければならないいくつかの具体的な基準があります。ここにあなたのデータモデルの推測に基づくサンプルです:
create database indexdemo
go
create table votes(id int identity primary key, ItemToVoteOn int, vote int not null)
go
CREATE VIEW dbo.VoteCount WITH SCHEMABINDING AS
select ItemToVoteOn, SUM(vote) as TotalVotes, COUNT_BIG(*) as CountOfVotes from dbo.votes group by ItemToVoteOn
go
CREATE UNIQUE CLUSTERED INDEX VoteCount_IndexedView ON dbo.VoteCount(itemtovoteon)
go
insert into votes values(1,1)
insert into votes values(1,1)
insert into votes values(2,1)
insert into votes values(2,1)
insert into votes values(2,1)
go
select ItemToVoteOn, SUM(vote) as TotalVotes from dbo.votes group by ItemToVoteOn
そして、このクエリ(ビューを参照しないか、拡張機能によって、それのインデックス)は、この実行計画での結果。インデックスが使用されていることに注意してください。もちろん、最後の言葉を、インデックスを削除(および挿入のパフォーマンスを得る)
そして、もう一つ。あなたが稼働していない限り、どのような種類の非正規化が実際に全体のスループットに役立つかを知る方法を実際に知っています。索引を使用すると、索引を作成したり、役立つかどうかを測定したり、必要に応じて索引を保持または削除することができます。これは、実行するのが安全な唯一の非正規化です。
あなたは 'SUM the Vote table'が確かに予算予算の範囲外であると判断しましたか? –