另一種選擇是在投票表上創建視圖,將投票合計爲TotalVotes。 然後索引視圖。
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
而這個查詢(不引用視圖或擴展它的指數)在此執行計劃的結果。注意使用索引。當然,刪除索引,(並且提升插入性能)
![alt text](https://i.stack.imgur.com/9sZhK.png)
而且一個硬道理。在你啓動和運行之前,如果任何類型的非規範化實際上會幫助整體吞吐量,那麼你就會知道這種方法。通過使用索引您可以創建它們,測量它是否有幫助或傷害,然後根據需要保留或刪除它們。這是唯一可以安全執行的非規範化性能。
您是否確定'SUM投票表'實際上超出了您的預算? – 2011-01-20 18:04:39