/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
ADODB tilføj record speedup
Fra : Leif Neland


Dato : 03-03-10 13:58

I noget "arvet" kode for at tilføje records til en tabel, så jeg dette, der
umiddelbart ser pænt ud.

Set Rs = server.createObject("ADODB.RecordSet")
Rs.CursorLocation = adUseClient
Rs.open "tabel", Record, adOpenStatic, adLockOptimistic
Rs.addNew
Rs("feltnavn1") = variabel1
Rs("feltnavn2") = variabel2
...... osv for de øvrige felter
Rs.Update
Rs.close

Men, det tager 6 sekunder at tilføje en record i en tabel med 50.000
records.
(Målt med "timer" før og efter open)
Eksperimenter med forskellige lock- og cursor-typer og indexer gør ingen
nævneværdig forskel.

Det viser sig, at det er
Rs.open "tabel"
der er synderen.
Rs.open "tabel" er i virkeligheden et synonym for rs.open "select * from
tabel"; man får et objekt med hele tabellen i, man kan bladre i. Det er jo
spild, når alt man ønsker er at tilføje.
Så istedet brugte jeg
Rs.open "select * from tabel where 0=1",...
timer gav tidsforbruget til 0, men det er med en opløsning på 1/64 sekunder.
Jeg kunne have loopet et par 1000 gange for at få en bedre tid, men mindre
end 0.0156 sek er godt nok til mig

Er rs.open "select * from tabel where 0=1" en elegant nok løsning, eller er
der bedre?

Leif





 
 
Stig Johansen (03-03-2010)
Kommentar
Fra : Stig Johansen


Dato : 03-03-10 14:38

Leif Neland wrote:

> Eksperimenter med forskellige lock- og cursor-typer og indexer gør ingen
> nævneværdig forskel.

Det er ikke lige ASP jeg gør mest i, men det er meget stor forskel på om man
bruger serverside/clientside cursor location, og ikke mindst fast forward
read only cursor (hvis det er MS SQLServer).

Men det er jo bindegalt at lave en open/select, hvi man vil indsætte en
record.

> Er rs.open "select * from tabel where 0=1" en elegant nok løsning, eller
> er der bedre?

Record sets er beregnet til desktop programmering, hvor man kan hente sættet
op i en eller anden grid.

Skal du have optimal performance, ska du bruge ren sql med "INSERT INTO
osv..", og hvis det er flere records i en 'batch', er det en fordel at
bruge parameterized queries, og blot udskifte parameterværdierne for hvert
kald.

--
Med venlig hilsen
Stig Johansen

Arne Vajhøj (03-03-2010)
Kommentar
Fra : Arne Vajhøj


Dato : 03-03-10 19:48

On 03-03-2010 07:57, Leif Neland wrote:
> I noget "arvet" kode for at tilføje records til en tabel, så jeg dette, der
> umiddelbart ser pænt ud.
>
> Set Rs = server.createObject("ADODB.RecordSet")
> Rs.CursorLocation = adUseClient
> Rs.open "tabel", Record, adOpenStatic, adLockOptimistic
> Rs.addNew
> Rs("feltnavn1") = variabel1
> Rs("feltnavn2") = variabel2
> ..... osv for de øvrige felter
> Rs.Update
> Rs.close
>
> Men, det tager 6 sekunder at tilføje en record i en tabel med 50.000
> records.
> (Målt med "timer" før og efter open)
> Eksperimenter med forskellige lock- og cursor-typer og indexer gør ingen
> nævneværdig forskel.
>
> Det viser sig, at det er
> Rs.open "tabel"
> der er synderen.
> Rs.open "tabel" er i virkeligheden et synonym for rs.open "select * from
> tabel"; man får et objekt med hele tabellen i, man kan bladre i. Det er jo
> spild, når alt man ønsker er at tilføje.
> Så istedet brugte jeg
> Rs.open "select * from tabel where 0=1",...
> timer gav tidsforbruget til 0, men det er med en opløsning på 1/64 sekunder.
> Jeg kunne have loopet et par 1000 gange for at få en bedre tid, men mindre
> end 0.0156 sek er godt nok til mig
>
> Er rs.open "select * from tabel where 0=1" en elegant nok løsning, eller er
> der bedre?

Hvorfor ikke bare fyre en god gammeldags INSERT af direkte ?

Arne

Leif Neland (03-03-2010)
Kommentar
Fra : Leif Neland


Dato : 03-03-10 23:19

Den 03-03-2010 19:47, Arne Vajhøj skrev:
> On 03-03-2010 07:57, Leif Neland wrote:
>> I noget "arvet" kode for at tilføje records til en tabel, så jeg
>> dette, der
>> umiddelbart ser pænt ud.
>>
>> Set Rs = server.createObject("ADODB.RecordSet")
>> Rs.CursorLocation = adUseClient
>> Rs.open "tabel", Record, adOpenStatic, adLockOptimistic
>> Rs.addNew
>> Rs("feltnavn1") = variabel1
>> Rs("feltnavn2") = variabel2
>> ..... osv for de øvrige felter
>> Rs.Update
>> Rs.close
>>

>
> Hvorfor ikke bare fyre en god gammeldags INSERT af direkte ?
>
> Arne

En insert skal laves med parametriseret eller med en del logik for at
undgå sqlinjects.

Denne metode er kortere og sikker. (Så vidt jeg kan se...)

Leif

Stig Johansen (04-03-2010)
Kommentar
Fra : Stig Johansen


Dato : 04-03-10 02:17

Leif Neland wrote:

> Den 03-03-2010 19:47, Arne Vajhøj skrev:
>> On 03-03-2010 07:57, Leif Neland wrote:
>>> I noget "arvet" kode for at tilføje records til en tabel, så jeg
>>> dette, der
>>> umiddelbart ser pænt ud.
>>>
>>> Set Rs = server.createObject("ADODB.RecordSet")
>>> Rs.CursorLocation = adUseClient
>>> Rs.open "tabel", Record, adOpenStatic, adLockOptimistic
>>> Rs.addNew
>>> Rs("feltnavn1") = variabel1
>>> Rs("feltnavn2") = variabel2
>>> ..... osv for de øvrige felter
>>> Rs.Update
>>> Rs.close
>>>
>
>>
>> Hvorfor ikke bare fyre en god gammeldags INSERT af direkte ?
>>
>> Arne
>
> En insert skal laves med parametriseret eller med en del logik for at
> undgå sqlinjects.
>
> Denne metode er kortere og sikker. (Så vidt jeg kan se...)

Hvis man har en funktion til selve udførslen, så synes jeg ikke den er
'kortere' end:
Dim parameters(10)
....
sql="insert into <tabel> values(?,?,?,?...)
parameters(0)=variabel1
parameters(1)=variabel2
parameters(2)=variabel3
....
rowsaffected=query(oConn,SQL,parameters,<antalparams>)

Det nummer med at udtage et recordsæt risikerer at give låsningsproblemer
(aka dårlig performance) i flerbrugersystemer.

--
Med venlig hilsen
Stig Johansen

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste