[SQL] Hoe is deze query te optimaliseren?

Pagina: 1
Acties:

  • LoekD
  • Registratie: Augustus 2000
  • Laatst online: 09-08 16:24
Ik heb 2 tabellen.
1. Gebruiker (User)
2. Data van gebruiker. (Position)
De relatie tussen Gebruiker en Data is 1:n (Data heeft GebruikerID)
Data wordt meerdere keren per dag ingevoerd. Ik wil van alle gebruikers de meest recente Row van vandaag hebben. Hiervoor heb ik het volgende bedacht:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
declare @temp as datetime
declare @date as datetime
declare @strDate as varchar(10)

set @date = getdate()
set @temp = convert(datetime,@date,105)
set @strDate = convert(varchar(10),@temp,105)
--create string notation of current date for comparing purposes

SELECT U.Fullname 
             ,P.Time 
FROM User U 
INNER JOIN Position P on U.UserID = P.UserID
WHERE 
P.Time = (SELECT top 1 P1.Time 
        from Position P1 
        where P1.UserID = U.UserID 
        and convert(varchar(10),P1.Time,105)  = @strDate        
          ORDER BY Time desc)


Deze query duurt naar mate de tabellen groeien steeds langer. Dat heeft uiteraard te maken met de 2e select.
Is er een efficientere manier om de meest recente Row (per user) uit een tabel te halen, dus zonder de hele tabel te sorteren en de eerste (=meest recente) Row terug te geven?

loading...


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Kan je niet met de MAX() functie aan de slag gaan?

code:
1
2
3
SELECT data.gebruikerId,  MAX(data.datum_cre)
FROM data
GROUP BY gebruikerId, blaat


Aangezien je query langer duurt naarmate je tabel groeit, rijst m'n vraag of je wel indexen op die tabel hebt liggen. Zoja, zijn de statistieken van die indexen wel up-to-date?

[ Voor 22% gewijzigd door whoami op 09-10-2003 12:31 ]

https://fgheysels.github.io/


  • LoekD
  • Registratie: Augustus 2000
  • Laatst online: 09-08 16:24
Dat werkt prima!
Echter lijkt het niet in mijn geval niet te gaan...

De query bevat ook nog een Column met het aantal Rows in een 3e tabel met een bepaalde status en 2 Columns met waarden uit tabel Positie.
Het punt bij het gebruiken van MAX(Time) op deze manier:

code:
1
2
3
4
5
6
7
8
9
10
11
12
[..]
                U.Fullname,
    max(P.Time)
    , P.longitude
    , P.latitude
    ,(
        SELECT count(*) FROM derdetabel
        WHERE derdetabel.ID = P.ID 
        AND derdetabel.status = 'bepaalde status'
        GROUP BY derdetabel.Status
      ) AS Aantal
[..]


Als je max(P.Time) gebruikt, mag je niet ook nog de andere Columns uit P lezen en de select count( * ) is ook niet toegestaan.

Misschien zie ik wat over het hoofd..?

[ Voor 2% gewijzigd door LoekD op 09-10-2003 13:42 . Reden: niet consequent in benamingen ]

loading...


Verwijderd

code:
1
convert(varchar(10),P1.Time,105)  = @strDate

Je forceert hierdooreen full-table scan door de functie op de datum. Hierdoor kan er geen index worden gebruikt.
Je zou beter
code:
1
P1.Time >= CONVERT( datetime, CONVERT( varchar, GETDATE(), 105 ), 105 )

kunnen gebruiken. Het oplossen van de twee functies kan nu aan het begin van de query, waardoor er beter van de index gebruikt kan worden.

[ Voor 14% gewijzigd door Verwijderd op 09-10-2003 13:45 . Reden: aanpassen voor huidige dag ]