[ hninel @ 03.06.2005. 15:26 ] @
Procesiram jedan file i unosim podatke u bazu [sql server 2000]. Treba uraditi insert oko 200000 rekorda 30 kolona, periodicno... inace file naraste do nekoliko miliona pa je potrebno to brzo unositi i cistiti...

Interesuje me kako najbrze unijeti podatke u bazu. Aplikacija je uradjena u C++ i koristi ADO tehnologiju.

Do sada se koristilo INSERT INTO... i tako unosilo, no to nije zadovoljavajuce. Jednom sam u SQL code-u koristio BULK INSERT iz raw file-a i bio je prilicno brzo. Sad bi ako je to najbrzi nacin to trebao uraditi iz varijable (CString ili nekog drugog char tipa).

Sta je brze INSERT INTO ili BULK INSERT?

Kakvu sve optimizaciju da koristim... da to ubrzam?

Hvala...
[ Riste Pejov @ 06.06.2005. 12:24 ] @
BULK Insert je dakako brze.

Kad imas bulk insert, ne parsira se query svakji put kada se importuje row, ne priprema se query plan ... i sl. Valjda i sve to ulazi u jedan query.

Ako zelis da maksimalno ubrzas INSERT INTO, sto na kraju krajeva bi se dobio isti rezultat kao bulk insert, bilo bi fino da uradis ovako:

1. Definiraj INSERT INTO command sa parametrima
2. Startuj transakciju
3. Pripremi SQL command (prepare query)
4. Udji u loop, menjaj parametre querija i izvrsavaj query.
5. Unprepare query
6. Ako nema greske Komituj transakciju, ako ima uradi rollback ...

Sve ovisi o tome koliko su podaci u fajlu spremni za direktan uvoz u bazi, dali treba neka priprema, implementacija nekih biznis pravila i sl. Ako su podaci spremni za direkt uvoz ... onda najbolje bulk insert, ako ne onda rucno insert into
[ Milovan_B @ 12.06.2005. 13:40 ] @
Zdravo hninel ,

Kao prvo nisi naveo koji je format datoteke (data source) koju zelis da uneses u SQL Server tabelu. Najjednostavniji nacin za unos podataka u SQL Server tabelu je da koristis utility DTS (Data Transformation Services) koji ti pruza mogucnost da napravis migraciju podataka iz CSC (Comma separated values), Excel itd.. DTS paket mozes da kreiras iz EM-a (Enterprise Manager) a daje ti i mogucnost da koristis VB ili Java script ako zelis da promenis format ulaznih podataka (recimo gada insertujes u Data Warehouse bazu podataka. DTS paket mozes da automatizujes i izvrsavas regularno iz SQL Server job-a. Ja dosta koristim DTS paket kada zelim da migriram data is jednog formata u drugi jer mi pruza mogucnost da u isto vreme izvrsim agregaciju podataka (sumari) i mogu da koristim paralelno pumpanje podataka.

Kada imam migraciju podataka iz tabele sa jedne instance SQL Servera na drugu ja vise volim da koristim BCP nego DTS, specijalno kada je veliki broj redova.

Evo ti primer:

--***********************************************************
-- Korak 1
-- Exportovanje tabele "MojaTabela"
-- u datoteku c:\MojaTabela.dat
-- Izvrsi iz QA (Query Analyser)
-- U ovom primeru je dat export u native formatu (mozes i u text formatu ali je import u novu bazu slow)
********************************************
USE master
xp_cmdshell "bcp ImeServera.ImaTvojeBazePodataka.dbo.MojaTabela out c:\MojaTabela.dat -n -T"


--***********************************************************
-- Korak2
--Pretpostavljam da ces recimo da kreiras novu tabelu u drugoj bazi gde unosis podatke
-- Kreiraj strukturu nove tabele da bude ista kao tabela iz koje exportujes podatke.
-- Najjednostavnije je da kreiras tabelu sa 'SELECT * INTO' gde ces da navedes uslov koji nikad nece biti TRUE. Recimo (1=0). Struktura tabele ce biti kopirana ali podaci ne.
--***********************************************************
USE ImeNoveBaze
SELECT *
INTO MojaNovaTabela
FROM ImeServera.ImaTvojeBazePodataka.dbo.MojaTabela
WHERE 1 = 0

--****************************************************************
-- Korak3
-- Sada mozes da importujes podatke iz datoteke koju si kreirao u prvom koraku "c:\MojaTabela.dat"
-- u tabelu MojaNovaTabela
--*****************************************************************
USE master
xp_cmdshell "bcp ImeServera.ImeBaze.dbo.MojaNovaTabela in c:\MojaTabela.dat -n -T"
--********************************************************

Da si naglasio iz kog tipa datoteke zelis da uneses podatke mogao bih da ti dam konkretniji odgovor.

Ja kada imam text datoteku koja je ogromna i iz koje zelim da azuriram tabele na SQL Serveru svakog dana (pod uslovom da text ima istu-nepromenljivu strukturu podataka) ne koristim ni bcp ni DTS. Jednostavno povezem text datoteku na target SQL Server (gde se azuriranje dogadja) ODBC (DSN) i onda koristim 'SELECT' naredbu da uzmem iz text datoteke ono sto mi treba. To je suvise dugacko da u ovom forumu idem u detalje. Ali ako zelis konkretan odgovor, tvoje pitanje treba da bude konkretno sa svim podacima.

Pozdrav,
Milovan


Regards,

Milovan

[ hninel @ 14.06.2005. 13:32 ] @
Hvala...
Ovi postovi su mi pomogli i po nekim drugim pitanjima...

Sto se tice mog pitanja, ono je bilo mozda specificnije za C/C++ programere koji su koristili C-DB library.
Ja sam ovo uspjesno rijesio i dobio zadovoljavajuce brzine.

Posao je bio, procesiranje jednog binarnog file-a koji sadrzi dosta podataka, i koji je trebalo da se prebaci, sredjen, u bazu.
Ovo ubacivanje u bazu uradjeno je koristenjem C-DB library-a (bcp_bind, bcp_sendrow...) i implementirali smo ga kao thread tako da smo dobili fine rezultate (90 sec. 200000 zapisa [36 kolona varchar (50)])

Svima hvala.