Optimer denne SP
Hej eksperterJeg har følgende, i forbindelse med et "hot or not" site:
Tabel: Pictures (PictureId, Votes, Rate)
Tabel: PendingVotes (PictureId, VoteIP, Vote)
View: PendingRatesAndVotes (PictureId, Votes, Rate)
PendingRatesAndVotes er en opsummering af PendingVotes hvor Votes er talt sammen, og Rate beregnet.
Jeg opsamler stemmer i tabellen PendingVotes, og således kan der ligge en hel del stemmer i løbet af en dag. Hver dag køres så en stored procedure der har til formål at regne alle stemmerne sammen og opdatere Pictures tabellen, sådan at hvert billede får påført korrekt antal votes og rate.
Min SP ser sådan ud:
UPDATE Pictures SET
Pictures.Rate = ( (Pictures.Votes * Pictures.Rate) + ( (SELECT Votes FROM PendingRatesAndVotes WHERE PictureId = Pictures.PictureId) * (SELECT Rate FROM PendingRatesAndVotes WHERE PictureId = Pictures.PictureId) ) ) / ( Pictures.Votes + (SELECT Votes FROM PendingRatesAndVotes WHERE PictureId = Pictures.PictureId) ),
Pictures.Votes = Pictures.Votes + (SELECT Votes FROM PendingRatesAndVotes WHERE PictureId = Pictures.PictureId)
WHERE Pictures.PictureId IN (SELECT PictureId FROM PendingRatesAndVotes);
DELETE FROM PendingVotes;
Grunden til udregningen er at hvis en record i Pictures ser sådan ud:
PictureID, Votes, Rate
1, 2, 5
- og der findes en enkelt stemme i PendingVotes:
PictureID, VoteIP, Vote
1, 127.0.0.1, 10
- så skal resultatet af record 1 i Pictures efter kørslen være:
PictureID, Votes, Rate
1, 3, 6.66666666666
Ovenstående SP må kunne gøres kortere?
Der er som sådan ikke noget performancemæssigt i vejen med denne SP, den køres på 5 sekunder på trods af ca 800,000 records i tabellen PendingVotes.
Kom glad - 200 points på spil.