Avatar billede jernespand Nybegynder
25. januar 2004 - 22:54 Der er 4 kommentarer og
1 løsning

Hurtigere INSERT

Her er koden:
-------------------------------------------------------------
objdbc.execute("create table a_dantemp(adr char(500));")
strSQL = "SELECT sendari FROM "&db&" WHERE sendari<>'';"
objRs.Open strSQL, objDbc, adOpenStatic, adLockReadOnly
tid2=timer

    do while NOT objrs.eof
    sendari=trim(objrs("sendari"))
    if instr(4,sendari,"?")>"2" then
        temp=instr(1,sendari,"//")
        blip=instr(temp+2,sendari,"/")
        prisur=left(sendari,blip)
        objdbc.execute("insert into a_dantemp(adr) values('"&prisur&"');")
    end if
    objrs.movenext
    loop
    response.Write "<br><br><br><b>LOOP Tid:</b>&nbsp;"&round(timer-tid2,5)
    objrs.close

    strsql = "SELECT adr, COUNT(*) as bitch FROM a_dantemp GROUP BY adr HAVING COUNT(*) > '1' order by bitch desc;"
    objRs.Open strSQL, objDbc, adOpenStatic, adLockReadOnly
    do while NOT objrs.eof
        response.Write "<br><b>"&objrs("adr")&":</b>&nbsp;&nbsp;"&objrs("bitch")
        objrs.movenext
    loop
    objdbc.execute("drop table a_dantemp;")
    call sqlclose(1,1)
end if
--------------------------------------------------------

Der bliver INSERT'et a_dantemp ca 1300 gange i loopet og det tager ca. 9 sek.

Hvordan kan det blive hurtigere? (Det er INSERT kommandoen der tager næsten 100% af tiden)
Avatar billede trer Nybegynder
25. januar 2004 - 23:13 #1
Det vil være væsentligt hurtigere at lave et bulk statement fremfor 1000 separate udtryk. Således:

insert into a_dantemp(adr)
select sendari from table

og foretage behandlingen af data ved hjælp af LEFT(), RIGHT() & CHARINDEX(). Det burde speede tingene noget op (kan ikke lige hurtigt overskue hvad du egentlig laver på sendari - men du kan sagtens eftergøre operationerne i T-SQL). Beskrivelsen af ovennævnte funktioner kan du finde i Books Online (Installeret sammen med dine klientværktøjer eller du kan downloade den fra http://www.microsoft.com/sql )

Evt skal du lave strengbehandlingen i en funktion på SQL Serveren. Det vil være hurtigere endnu end at lave dem i SELECT'en.

Der er en ekstra fordel her - benytter du et bulk statement vil du ikke have det overhead der er med at flytte data ud af databasen og retur.

Du kan også prøve at tilføje OPTION(KEEP_PLAN) til dit insert - dermed vil SQL Server ikke forsøge at opdatere statistikker etc - og det øger hastigheden. Check Books Online for dette.

Sidst - hvis du har indeks på dantemp tabellen - så fjern dem før insert'en og læg dem på igen bagefter. Det øger også indsættelseshastigheden.

I øvrigt - det er ikke bare fordi dine diske står og trasher at du har dårlig performance?  Hvis du har databasens logfiler og datafiler på samme disk og i øvrigt har tempdb og Windows pagefile på samme diske - så har du et seriøst setup problem.
Avatar billede trer Nybegynder
28. januar 2004 - 12:27 #2
Hvad sker?
Avatar billede trer Nybegynder
06. februar 2004 - 15:05 #3
-do-
Avatar billede trer Nybegynder
19. februar 2004 - 11:33 #4
hvad sker?
Avatar billede trer Nybegynder
08. marts 2004 - 10:55 #5
do?
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