Avatar billede longgaard Novice
01. september 2020 - 14:30 Der er 3 kommentarer og
1 løsning

Mere fart på SQL

Jeg har indlæst en logfil til en tabel i MS SQL Server 2019.

I Server Management Studio v18.5.1 forsøger jeg at lave en liste over unikke brugere, med et eksempel på hvornår brugeren har været registreret i loggen.
Hvilket tidspunkt MS SQL finder frem til mig, er ligegyldig, bare den passer til brugeren.
Der er tale om en database med data af midlertidig karakter, og som ikke skal i egentlig produktion.
Normalisering er ikke noget krav eller ønske.

Virtuelt Hardware i brug er 8 kerner Xeon Silver 4215 @ 2.5GHz, 128 GB RAM, 335 GB VHD (på spindel i RAID 10)

I en lille test-tabel med 9 rækker, har jeg testet nedenstående queries, og de giver begge to de resultater jeg ønsker og queryen afvikles hurtigt.

I en lidt større log-tabel med 3.800.000 rækker tager det 3 timer.
Og det endelige mål er at køre den på tabel med 19.500.000 rækker.

Hvordan kan jeg skrive min query så den afvikler hurtigere?



SELECT [Col_Navn] as Bruger,
  ( SELECT TOP 1 [col_Tid] as Tid
  FROM [Tab_Log]
  WHERE [Col_Navn] = Tabellen.[Col_Navn] )
FROM [Tab_Log] AS Tabellen
WHERE [Col_Navn] IS NOT NULL
GROUP BY [Col_Navn]


SELECT DISTINCT [Col_Navn] as Bruger,
  ( SELECT TOP 1 [col_Tid] as Tid
  FROM [Tab_Log]
  WHERE [Col_Navn] = Tabellen.[Col_Navn] )
FROM [Tab_Log] AS Tabellen
WHERE [Col_Navn] IS NOT NULL
Avatar billede dennisbjorn Juniormester
01. september 2020 - 20:01 #1
I stedet from sub-select, kan bruge max funktionen til finde nyeste tidspunkt pr. bruger:

SELECT [Col_Navn] as Bruger, max([col_Tid]) as Tid
FROM [Tab_Log]
WHERE [Col_Navn] IS NOT NULL
GROUP BY [Col_Navn]

Men du bør nok overveje at indeksere din tabel.
Avatar billede arne_v Ekspert
02. september 2020 - 00:50 #2
Er der indeks paa col_tid og col_navn?
Avatar billede arne_v Ekspert
02. september 2020 - 00:53 #3
Men ja MAX er nok hurtigere:

SELECT DISTINCT [Col_Navn] as Bruger,MAX([col_Tid]) as Tid
WHERE [Col_Navn] IS NOT NULL
GROUP BY [Col_Navn]
Avatar billede longgaard Novice
02. september 2020 - 08:22 #4
MAX afvikler meget hurtigere. Resultatet var på skærmen på 1 minut 58 sekunder.

Tak for hjælpen
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

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