Avatar billede philiph Nybegynder
24. februar 2004 - 15:41 Der er 5 kommentarer

Hurtigste måde at indsætte data ind i SQL Server tabel.

Jeg har brug for den hurtigste måde at indsætte data i SQL server tabel.

Forudsætninger:
- Client Server Løsning. Program kører på en anden fysisk server end SQL serveren.
- Data kommer fra en Access Database med 6000 besvarelser med 300 spørgsmål pr besvarelse.
- Svar ligger ikke relationelt i Access (i note felt), men skal på SQL serveren ligge som relation imellem spørgsmål og svar.

Jeg har konstrueret et program der laver de 6000 poster om til 1.8 million relaterede poster.

Tid Access database 20 min
Tid SQL server: > 6 timer!!!! (der stoppede jeg den).

Jeg har nu løst problemet på en anden måde (kopieret Access database til SQL Server, og brugt import data wizard), men det irriterer mig at jeg ikke kunne få det til at spille.

Har i dag lavet et testprogram der indsætter dummy data i en test tabel med 5 forskellige datatyper:

Eksempel :
  For i = 1 To Iterations
    rs.AddNew
    rs!TestInt = i
    rs!TestChar = "Hello world" & i
    rs!TestDate = Date
    rs!TestFloat = i * 3.1415926
    rs!TestText = String(i, "P")
    rs.Update
  Next i

Jeg har så foretaget målinger på hvor hurtigt det kan udføres på forskellige måder:

1.    INSERT statements som udføres med ADO.connections Execute metode
2.    ADO Recordset baseret på "SELECT * FROM Table Where Key Is Null", og så benytte AddNew og Update.
3.    Parameter INSERT statement igennem ADO command object.
4.    Stored Procedure som udfører insert igennem ADO command object.

Metode 1 er klart den langsomste, metode 4 den hurtigste, men forskellen på 2-4 er kun få procent.

Har prøvet med ODBC og OLEDB connection string: OLEDB er hurtigere (~5%), og metode 3 og 4 er kun understøttet under OLEDB.

Har prøvet med eller uden transaktion: Med er hurtigere i størretsordnen 1-2%

Har prøvet med eller uden primær index på TestInt. Ikke målbar forskel.

Men performance ligger stadig på niveau med det oprindelige program jeg skrev (Benyttede metode 2).

Hvordan kan man få sådan en batch insert til at performe bedre?

OBS! Det er "snyd" at lave en stored procedure som indeholder løkken, for det kan ikke bruges i mit praktiske scenario.
Avatar billede trer Nybegynder
24. februar 2004 - 16:13 #1
Kan du mellemlande data i en tekstfil?  Hvis så, så kan du benytte BCP til at lave bulk load - det vil gå ganske stærkt.

Mht performance - det er sandsynligvis loop i vb der giver problemet, ikke indsættelen i sql server (med normal dimensioneret hw og korrekt sql server setup; ikke autoshrink, autoclose sat på etc).

Jeg ville i øvrigt normalt anbefale at du smed data over "råt" på sql server og derefter behandlede dem der.
Avatar billede trer Nybegynder
24. februar 2004 - 16:15 #2
Lige en kommentar:
"Jeg har konstrueret et program der laver de 6000 poster om til 1.8 million relaterede poster.

Tid Access database 20 min
Tid SQL server: > 6 timer!!!! (der stoppede jeg den)."

Det lyder for mig som om du har lavet det sådan at du har 1.8 millioner rækker i Access?  Hvis så, så kan du bruge Import Wizard til at overføre fra Access til SQL Server - normal performance er ca. 20.000 rækker per sekund.
Avatar billede philiph Nybegynder
24. februar 2004 - 16:38 #3
trer: Jo, jeg har kikket på BCP (BULK INSERT SQL kommando), men jeg synes det er som at gå over åen for at hente vand. Hvordan laver man et program som har samme performance som BULK loaderen? Det er det denne "øvelse" går på...

trer(2. indlæg): ...og hvis du læser videre, kan du se at det var netop det jeg gjore.
Avatar billede trer Nybegynder
24. februar 2004 - 22:12 #4
Umiddelbart kan du ikke lave et program (i vb / access) som har samme performance som bcp der er skrevet i C. Derudover - via ADO har du ikke low-level access til sql server, men en rimelig "forfinet" adgang - hvad der giver overhead.

Men 6 timer for at indsætte 1.8 millioner rækker er stadig i skoven. Det svarer til ca. 83 rækker i sekundet!

Jeg prøvede lige at lave 1.8 millioner rækker i Access udfra din opskrift ovenfor og testede derefter overførslen til en MSDE 2000 database på samme maskine. (HW = Thinkpad T30 1.8 Ghz maskine med 256 mb ram). Overførselstiden til SQL Server var 5 minutter og 33 sekunder.

Hvis du har væsentligt længere overførselstid via en Import Wizard på sammenlignlig HW så vil jeg mene det er et problem i din db opsætning.

Jeg prøvede også lige at linke en tabel fra sql server over i access for der at lave en Append Query. No go - fejl "System resource exceeded" efter 2-3 minutter, så den har jeg ikke leget videre med.

Men du kan kalde objekterne der benyttes i Import Wizard fra dine egne vb programmer - du skal checke Books Online (installeret sammen med Enterprise Manager / Query Analyzer - eller download fra www.microsoft.com/sql ) for SQL DMO.
Avatar billede philiph Nybegynder
25. februar 2004 - 17:16 #5
Den maskine jeg oprindeligt foretog målingen på er en P2/350 :D. Ny hardware er opsat og vi er ved at flytte applikationerne.

Jeg har fundet en artikel om et nyt objekt der er til rådighed i SQL Server 2000 med SP3. Hvis det ikke giver noget, så vil jeg kikke på SQL DMO'en.
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