Problem med (extremt) långsamt SQL Server-anrop

Permalänk
Medlem

Problem med (extremt) långsamt SQL Server-anrop

Hej,

Jag har en tabell där en kolumn X har typen int32. När jag gör anropet

select top(10) from Log where X in(a,b,c,d,e) order by ID desc

går det snabbt med 1-3 argument i in-satsen, men med 10 argument så tar det nästan en sekund. Större antal argument ger timeout i resten av mitt program. Hur många element jag plockar ut verkar inte påverka tiden det tar.

Jag måste ha missat något grundläggande vad gäller in()-satsen, det ska väl gå att skicka med 100-tals argument?

Jag använder SQL Server Compact och antalet rader ligger kring 500 000.

Väldigt stort tack på förhand!

Permalänk
Medlem

Här diskuteras ett liknande problem, kan kanske ge någon idé till lösning: http://www.windows-tech.info/15/9d00bb9c6471f6e9.php

Permalänk

Ärligt talat varför ser du inte problemet själv?
Din sql satts gör ngt sådant här om jag inte har fel.

Kolla rad 1 mot argument 1, (if) lägg i lista, sortera lista
Kolla rad 1 mot argument 2, (if) lägg i lista, sortera lista

Visa signatur

[5900x][MSI-B550-Tomahawk][RTX-3700][32GBRam3200CL14]

Permalänk
Medlem

Wishie: Ska prova att byta in mot join och se om det gör någon skillnad. Kan tyvärr inte testa förrän nästa gång jag är på jobbet, om en vecka.

SirMauser: Ärligt talat, nej. Men det beror nog mest på att jag inte är speciellt hemma i SQL-syntaxen. Hur skulle satsen skrivas om enligt dig? Det jag vill göra är ju att ta ut de x första / sista raderna som matchar sökkriteriet (tyvärr finns ju inte select bottom)

Permalänk
Medlem

SirMauser: va snackar du om egentligen? Nu vet jag inte exakt hur varje sqlhanterare jobbar med sina sql-satser, men har väldigt svårt att tro att den jobbar så som du beskriver det, men du kanske har koll på hur SQL Server Compact utför querys?

ph0ng: Jag antar att fält x är indexerat? Annars har du boven där... För nog har du uppfattat in kommandot rätt... Det borde inte vara några problem att exekvera den queryn

Permalänk
Medlem

thrawn: x är indexerat, riktigt hur vet jag inte men det finns en nyckel för det (och ID, som det ska sorteras efter, är huvudnyckel i tabellen).

Det konstiga är att färre antal argument går snabbt. Färre antal argument innebär i mitt fall att raderna är utspridda över ett större område, och borde därför vara minst lika långsamt. Antal jämförelser bör vara någorlunda konstant då värdena i x är likformigt fördelade.

Permalänk
Medlem

Kolla Execution Plan för att se om du får Index Seek, annars träffar du inte hela indexet.

Då kan du behöva skapa ett nytt index för enbart X eller på annat sätt försöka träffa hela indexet i din where-sats.