Avatar billede milandt Nybegynder
07. marts 2007 - 21:43 Der er 10 kommentarer og
1 løsning

Hvorfor tager "SELECT TOP 1" længere tid end "SELECT"?

Hey,

Jeg har en SP som jeg er ved at optimere.

    SELECT
        P1.PictureId AS PictureId1,
        P2.PictureId AS PictureId2
    FROM
        gss_Pictures P1
        INNER JOIN gss_Pictures P2 ON P1.[Size] = P2.[Size] AND P1.PictureId <> P2.PictureId
    WHERE
        P1.PictureId NOT IN (SELECT FK_PictureId1 FROM gss_PicturesSameSize WHERE FK_PictureId2 = P2.PictureId)
        AND P1.PictureId NOT IN (SELECT FK_PictureId2 FROM gss_PicturesSameSize WHERE FK_PictureId1 = P1.PictureId)

Den behøver ikke give super meget mening - mit spørgsmål er, hvorfor tager "SELECT TOP 1 .." mange gange længere tid end "SELECT .." ?

Ovenstående sql returnerer 2500 rækker, og det tager omkring 2 sekunder. Jeg skal dog kun bruge den første, så jeg indsætter TOP 1 efter SELECT.

Nu tager min sp pludselig 15+ sekunder.. why? Er der noget grundlæggende om TOP jeg ikke er klar over, eller er min sp bare generelt fucked up rent performancemæssigt?
Avatar billede kalp Novice
07. marts 2007 - 21:53 #1
prøv at lave "order by" sammen med din TOP.
tror det vil gå hurtigere!!
Avatar billede milandt Nybegynder
07. marts 2007 - 23:32 #2
Nææ.. det var det samme
Avatar billede kalp Novice
07. marts 2007 - 23:42 #3
hvad med max istedet for top?

SELECT
        MAX(P1.PictureId) AS PictureId1,
        MAX(P2.PictureId) AS PictureId2

returnere også kun det sidste.
Avatar billede milandt Nybegynder
07. marts 2007 - 23:50 #4
det kan jeg ikke - mine PictureId's er guids. men det er nu heller ikke fordi jeg VIL have TOP 1 ud, det virker bare mest "rigtigt".. jeg undrede mig bare over at den blev 10 gange langsommere, blot fordi jeg tilføjede TOP 1.
Avatar billede kalp Novice
08. marts 2007 - 00:11 #5
Ved ikke hvorfor select er hurtigere en select med top, men må gå ud fra det er ekstra arbejde til db'en af en grund.

beklager:/


har dog et sidste bud!! prøv dette


SELECT
        IDENT_CURRENT ('P1.PictureId') AS PictureId1,
        IDENT_CURRENT ('P2.PictureId') AS PictureId2
Avatar billede milandt Nybegynder
08. marts 2007 - 00:23 #6
for det forste forstår jeg ikke at det skulle være hurtigere at hente 2000+ rækker frem for 1 række. for det andet forstår jeg ikke at det tager 10+ gange længere tid med top 1..

det er også hurtigt med top 5.. men f.eks ved top 3 der går det amok og tager laaaang tid.

IDENT_CURRENT hjælper heller ikke. hvis jeg stadig har top 1 på, tager det lige lang tid, desuden er værdien af IDENT_CURRENT ('P1.PictureId') bare null..

du må gerne få points for din response (exp.dk er lidt død for tiden), men forstår stadig ikke at det skulle gøre en sp langsommere at have top 1 på.
Avatar billede kalp Novice
08. marts 2007 - 00:27 #7
lad spørgsmålet stå åben til i morgen:) så kan vi afslutte det der.
jeg er enig at det virker lidt ulogisk!

forresten.. ærgeligt at IDENT_CURRENT ikke fungerede.. ville ellers mene den skulle hente sidste opretterede guid for den enkelte tabel, men det har sikkert noget at gøre med hvordan man opretter sine guids.

men som sagt.. lad spørgsmålet stå til i morgen:)
jeg vil gerne lige have mulighed for at finde en forklaring nemlig.
Avatar billede milandt Nybegynder
18. maj 2007 - 13:12 #8
jeg fandt aldrig ud af hvorfor der skulle være dette kæmpe performance hit ved TOP 1, men hvis du vil have points så har du et par dage til at lægge et svar. er ved at lukke gamle spørgsmål.
Avatar billede kalp Novice
18. maj 2007 - 20:19 #9
mit eneste bud er at du har en masse data i din database og hvis du satte index'es på dine tabeller så ville det ikke tag lang tid at lave en TOP 1
Avatar billede kalp Novice
18. maj 2007 - 20:20 #10
(eller at du ikke har angivet en primary key i den tabel du laver top 1 på )
Avatar billede milandt Nybegynder
18. maj 2007 - 20:49 #11
kan godt være at det har noget at gøre med manglende index at gøre.. det underlige var bare at en top 5 var fin nok, men top 1 tog 15+ sekunder.

anyway, 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