Avatar billede milandt Nybegynder
23. juli 2006 - 00:49 Der er 1 kommentar og
1 løsning

Optimer denne SP

Hej eksperter

Jeg 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.
Avatar billede bennytordrup Nybegynder
23. juli 2006 - 10:29 #1
Det eneste, jeg kan se, er, at du kan omskrive din Update således, at der ikke er en masse nestede Select i den:

update        Pictures
set            Votes = NewVotes,
            Rate = NewRate
from        Pictures P
            inner join    (    select        PictureID, Sum(Votes) as NewVotes, Sum(Rate)/Sum(Votes) as NewRate
                            from        (    select    PictureID, Votes, Rate*Votes as Rate
                                            from    Pictures
                               
                                            union all
                               
                                            select    PictureID, Votes, Rate
                                            from    PendingRatesAndVotes
                                        ) X
                            group by    PictureID
                        ) SummedVotesAndRate
            on P.PictureID = SummedVotesAndRate.PictureID
Avatar billede milandt Nybegynder
24. juli 2006 - 11:05 #2
den beregning og opdatering af Pictures tabellen du laver virker ikke helt som jeg beskrev, men I get the idea.

tak for input
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB