Avatar billede troelsm Nybegynder
16. april 2006 - 17:48 Der 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
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Avatar billede mitbrugernavn Praktikant
16. april 2006 - 18:00 #1
prøv denne mySQL

<%
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
%>
Avatar billede troelsm Nybegynder
16. april 2006 - 19:30 #2
Tak for svaret - men det giver desværre ikke noget,
i access tager en gennemkørsel 1. sekunder men i SQL tager det 5. sekunder

Jeg tror stadigvæk det er
strSQL2 = "SELECT * FROM datoer where dato = '" & dato1 & "' AND ID = " & id
der må være problem - jeg kan bare ikke se hvad
Avatar billede kjulius Novice
16. april 2006 - 22:21 #3
Er ID sat til primary key i begge db's? Hastighedsproblemer er som oftest fordi der ikke er de rigtige indexes...
Avatar billede softspot Forsker
17. april 2006 - 03:03 #4
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.
Avatar billede troelsm Nybegynder
18. april 2006 - 16:52 #5
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.
Avatar billede troelsm Nybegynder
17. maj 2006 - 00:02 #6
Lukket
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
Kurser inden for grundlæggende programmering

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