Другой вариант - создать представление таблицы голосов, объединяющее голоса в виде TotalVotes.Затем индексируйте представление.
Волшебство оптимизатора SQL Server (я думаю, что только для корпоративной версии) заключается в том, что, когда он видит запросы суммы (voiceColumn), он выбирает это значение из индекса для представления того жеданные, что удивительно, если учесть, что вы не ссылаетесь на представление непосредственно в своем запросе!
Если у вас нет корпоративной версии, вы можете запросить общее количество голосов в представлении, а не в таблице,а затем воспользуйтесь индексом.
Индексы - это, по сути, денормализация ваших данных, о которых знает оптимизатор.Вы создаете или отбрасываете их по мере необходимости и позволяете оптимизатору выяснить это (никаких изменений в коде не требуется). Как только вы начнете идти по пути собственной денормализации, созданной вами, вы будете встраиваться в ваш код на долгие годы.
Извлечение Повышение производительности с помощью индексированных представлений
Существуют некоторые конкретные критерии, которые должны быть соблюдены для работы индексированных представлений.Вот пример, основанный на предположении вашей модели данных:
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
И этот запрос (который не ссылается на представление или, по расширению, его индекс) приводит к этому плану выполнения.Обратите внимание, что индекс используется.Конечно, отбросьте индекс (и увеличьте производительность вставки)
![alt text](https://i.stack.imgur.com/9sZhK.png)
И последнее слово.До тех пор, пока вы не начнете работать, есть действительно известный способ узнать, поможет ли какая-либо денормализация на самом деле общей пропускной способности.С помощью индексов вы можете создавать их, измерять, помогает ли это или причиняет боль, а затем сохранять или отбрасывать их по мере необходимости.Это единственный вид денормализации для производительности, который можно сделать безопасно.