16. april 2006 - 17:48Der er
5 kommentarer og 1 løsning
Samme script tager 5 gange så lang til med SQL end Access databas
Hejsa jeg er igang med at konveretere noget over fra en Access database til en SQL server. Alt ser også ud som om det virker men samme script tager 5 gange så lang tid når jeg benytter SQL databasen som når jeg benytter Access databasen, jeg havde jo nok forventet at have mindst den samme performance, håber nogen kan se hvad jeg evt kan fintune / se hvad der skal ændres . Det er de samme data der findes i begge så den laver 91 loop af RS7, begge gange - så min formoding er at det er kaldet RS8 der er problem - men hvorfor ved jeg ikke.
Script ser sådan ud i henholdsvis når jeg benytter Access og MS SQl - - - - dato1 = aar & "-" & moned & "-" & dag
- - - - SCRIPT NÅR DET ER ACCESS der benyttes - - - - strSQL = "SELECT * FROM SortGennemsnit where TypeID = " & TypeID & " AND StillingID = " & StillingID & " AND Gruppe = " & Gruppe rs7.Open strSQL, cn Do until rs7.EOF
strSQL = "SELECT * FROM datoer where dato = #" & dato1 & "# AND ID = " & rs7("id") rs8.Open strSQL, cn if rs8.eof then ' ikke fundet else IF rs8("status") = "R" OR rs8("Status") = "G" OR rs8("Status") = "X" THEN antaltest = antaltest + 1
ELSE
END IF end if rs8.close rs7.movenext loop rs7.close - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - SCRIPT NÅR DET ER MS SQL der benyttes - - - - strSQL = "SELECT * FROM SortGennemsnit where TypeID = " & TypeID & " AND StillingID = " & StillingID & " AND Gruppe = " & Gruppe rs7.Open strSQL, cn Do until rs7.EOF
strSQL = "SELECT * FROM datoer where dato = '" & dato1 & "' AND ID = " & rs7("id") rs8.Open strSQL, cn if rs8.eof then ' ikke fundet else IF rs8("status") = "R" OR rs8("Status") = "G" OR rs8("Status") = "X" THEN antaltest = antaltest + 1
ELSE
END IF end if rs8.close rs7.movenext loop rs7.close - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<% strSQL = "SELECT * FROM SortGennemsnit where TypeID = " & TypeID & " AND StillingID = " & StillingID & " AND Gruppe = " & Gruppe rs7.Open strSQL, cn Do until rs7.EOF id = rs7("id") strSQL2 = "SELECT * FROM datoer where dato = '" & dato1 & "' AND ID = " & id rs8.Open strSQL2, cn if rs8.eof then ' ikke fundet else bogstav =rs8("status") bogstav_2 = "R,G,X" if instr(bogstav_2,bogstav) > 0 then antaltest = antaltest + 1
ELSE
END IF end if rs8.close rs7.movenext loop rs7.close %>
Umiddelbart virker det som en utrolig dyr måde at tælle rækker i en database. Jeg tror du skal tænke løsningen anderledes, dvs. bruge de faciliteter som databasesystemet stiller til rådighed (dvs. COUNT og JOIN i dette tilfælde).
Prøv flg. konstruktion:
strSQL = "SELECT COUNT(d.id) AS antaltest " & _ "FROM SortGennemsnit sg " & _ "INNER JOIN datoer d ON sg.id = d.id " & _ "WHERE sg.TypeID = " & TypeID & _ " AND sg.StillingID = " & StillingID & _ " AND sg.Gruppe = " & Gruppe & _ " AND d.dato = '" & dato1 & "' " & _ " AND (d.status = 'R' OR status = 'G' OR status = 'X')" set rs = cn.Execute(strSQL) if not rs.eof then antaltest = rs("antaltest") else ' DETTE ER EN ALVORLIG FEJL! DER BØR ALTID VÆRE ET RESULTAT AF DENNE FORSPØRGSEL. antaltest = 0 end if rs.close
Rent bort set fra denne radikale andeledes måde at løse opgaven på, er jeg da enig med kjulius i at, det nok er et indekseringsproblem der gør at MS SQL Server er langsommere end Access i din løsning. Jeg vil dog til hver en tid anbefale dig at bruge databasen til at løse denne type af opgaver når det er muligt - det performer for det meste langt bedre end scriptkode. Det er aldrig godt at lave mange enkeltstående opslag i en database, så hvis man kan undgå det bør man gøre det. Desuden bør du være mere kritisk med hvilke data/kolonner du henter ud af databasen - i dit tilfælde, havde du i realiteten kun brug for status, men du henter alle felter alligevel, hvilket også er spild af resurser i flere henseender (specielt hvis der er tale om tabeller med mange felter/kolonner).
NB: Mit eksempel forudsætter naturligvis at der ikke er mere funktionalitet end det du har vist her, altså at der ikke foregår mere end en simpel optælling på grundlag af de kriterier du har vist her.
Tak for de gode kommentar og ja index var problem i tabel datoer så Kjulius ramte rigtigt, nu er problem dog at jeg nogle gange (og kun nogle gange) får denne fejl [DBNETLIB][ConnectionOpen (Connect()).]SQL Server does not exist or access denied
og det er ingen logik i - hvornår den kommer jeg har søgt og på nettet og har også fundet en del men ikke rigtig noget som fortæller mig hvorfor den kommer fra tid til anden.
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.