18. oktober 2002 - 21:51Der er
13 kommentarer og 1 løsning
SQL hjælp
Jeg har lavet et debat forum og ønsker, ud for hver tråd at vise hvor mange indlæg der har været siden en given dato.I dag gør jeg det ved først at selecte rod-indlægene - og hvor hver af dem lave et select statement der summere op hvor mange svar der har været. Men det går lidt for langsomt. Så jeg spekulerer på om man kunne lave det i 1 eller 2 select statements.
Her er lidt psudo code for hvordan jeg gør idag:
rs = "select * from spørgsmål" while not rs.eof rsCount = "select count(*) AS nr from svar where debat_svar_dato > CONVERT(datetime, '19/08/2002 21:51:26', 105) AND spørgsmålsid = 1638"
response.write "der er " & rsCount("nr").value & " svar i denne tråd"
For at fortsætte med kommentarer, så er det en dårlig ide at bruge count(*). Ud fra select statementet går jeg ud fra, at du også har et svarid på svar-tabellen, så det vil være bedre at lave denne:
select spørgsmålid, count(svarid) as nr from svar where debat_svar_dato > '20020819 21:51:26:000' group by spørgsmålid
Og når vi er herovre, så vil det bedste indeks, du kan lave på tabellen i den her forbindelse (hvis det er en forespørgsel, der bruges meget) være et indeks på felterne spørgsmålid, svarid, debat_svar_dato.
Det giver dig et indeks, der dækker alle felter i forespørgslen (covering index), hvilket betyder, at SQL Server kan give dig svaret uden overhovedet at komme ned i de egentlige data, da alle nødvendige data ligger i indeks.
Ydermere: I din pseudo-kode laver du en select *. Dette er IMO en dødssynd at gøre mod en SQL Server. Du skal ALDRIG bede om flere data, end du har brug for. Har du brug for to bestemte felter, selecter du disse bestemte to felter.
Omkring evt. pointfordeling: Læg et svar selv, og fordel med størstedelen af pointene til dig selv. IMO er spørgsmålet ikke mere end 20-30 points værd.
COUNT(*) is optimised to return very quickly if the SELECT retrieves from one table, no other columns are retrieved, and there is no WHERE clause. For example:
Det er ikke fordi jeg er uenig med dig ! Men man skal bare være opmærksom på, at count(*) kan være optimeret for visse selects, hvorfor det ikke altid er en dårlig idé at bruge count(*). MySQL er tilfældigvis bare den database jeg bruger, jeg kender ikke til detaljerne for MS SQL, men mon ikke der her også foregår noget optimering.
MS SQL Server ændrer faktisk en Count(Primærfelt) til Count(*) i execution plan.
Synes godt om
Ny brugerNybegynder
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.