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