Jak wciągnąć dużą porcję danych do bazy danych Oracle 10 g Express
mwgomez - 14-11-2006 00:09
Jak wciągnąć dużą porcję danych do bazy danych Oracle 10 g Express
Mam następujący problem. Potrzebuję wciągnąć zawartość pliku tekstowego o rozmiarze 500 MB (ale mam i większe) w "rozsądnym" czasie do bazy danych Oracle 10 g (mam do dyspozycji tylko Oracle Database 10 g Express Edition). Na początek spróbowałem napisać program w Delphi + ZeosLIB, ale to było dodawanie po jednym wierszu i nie szło tego przeskoczyć (tzn. chciałem dać do Query kilka insertów na raz ale się nie dało, tak samo jak nie udało się utworzyć stored procedure) wobec tego zrezygnowałem. Następnie próbowałem wykorzystac komponenty kompercyjne ODAC, było nieco szybciej (najszybciej z wykorzystaniem stored procedure), ale i tak za wolno. Spróbowałem tam również wykorzystać komponent Script licząc na to, ze będę mógł dodawać na raz po np. 100 wierszy. Rzeczywiscie tak sie da ale to jest jeszcze wolniej. W końcu wykorzystałem istnienie w "Database Home Page" funkcji Load/Import Data. Tam się wskasuje plik tekstowy (mam go sformatowany, pola oddzielone tym samym znakiem) oraz tabelę do której to wrzucić (w sumie 6 pól, nic wielkiego, tylko ilość wierszy ogromna). I tutaj przyznaję czas okazał się być do przyjęcia, tylko, że udało mi sie wrzucic do tabeli 100 000 wierszy, następnie 200 tyś i 300 tyś, ale jak spróbowałem wczytać 400 000 wierszy (tych wierszy może być kilka milionów) to program mi "głupieje" (w każdym bądź razie import się nie udaje). I teraz nie wiem czy to jest tak że mam za słaby komputer (1.8 GHZ + 500 MB RAM), czy to jest jakieś ograniczenie w Oracle 10g Express? Może ktos ma jakies doświadczenie w podobnym temacie i mógłby sie ta wiedzą podzielić, albo może ktoś zasugeruje inne (szybkie i skuteczne ) rozwiązanie?
Pozdrawiam
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Michał Kuratczyk - 14-11-2006 00:09
mwgomez wrote: > Mam następujący problem. Potrzebuję wciągnąć zawartość pliku tekstowego o > rozmiarze 500 MB (ale mam i większe) w "rozsądnym" czasie do bazy danych > Oracle 10 g Zdecydowanie poczytaj o external tables. W dokumentacji znajdziesz szczegóły, a przykłady użycia na asktom.oracle.com. Ogólnie polega to na tym, że definiujesz plik tekstowy (oczywiście należycie sformatowany), jako tabelę i możesz się do niej odwoływać SELECTem.
-- Michał Kuratczyk
zarafiq@poczta.onet.pl - 14-11-2006 00:09
[...] > udaje). I teraz nie wiem czy to jest tak że mam za słaby komputer (1.8 GHZ + > 500 MB RAM), czy to jest jakieś ograniczenie w Oracle 10g Express? Może ktos [...]
500 MB ramu to trochę mało. Przyjrzyj się narzędziu SQL*Loader (sqlldr.exe).
Pozdrawiam zarafiq
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
panczo - 14-11-2006 00:09
zarafiq@poczta.onet.pl napisał(a): > [...] >> udaje). I teraz nie wiem czy to jest tak że mam za słaby komputer (1.8 GHZ + >> 500 MB RAM), czy to jest jakieś ograniczenie w Oracle 10g Express? Może ktos > [...] > > 500 MB ramu to trochę mało. > Przyjrzyj się narzędziu SQL*Loader (sqlldr.exe). >
oczywiscie malo, jesli chce sie zaladowac caly plik do pamieci. Robilem podobna rzecz z plikiem wsadowym w MSSQL, ktory byl podobnych rozmiarow. Dla niego napisalem wlasny parser w Javie, ktory otwieral plik i wczytywal dane linia po linii, nie pobierajac go w calosci do pamieci. Trwa to dosyc dlugo, bo kilka godzin, ale masz pewnosc, ze zasoby komputera sa w normie (pewnie w Delphi pisales podbnie).
Napisales, ze po 400 000 lini import sie konczyl. Przyczyn moze byc wiele, od bledow w pliku wsadowym (byc moze nie wszystkie dane sa dobrze sformatowane, moze brakuje kolumn, przyjrzyj sie temu doklanie - stworz raport!!), braku polaczenia, po timeouty, itp. (w zaleznosci, gdzie lezy serwer bazy). Napisz moze cos w stylu "try i catch" w probach np. do 5. Stworz raportowanie (do pliku) np. na ktorej linii parser stanal i dlaczego. Po ponownym jego starcie nie zaczynaj od lini 1, a wlasnie od tej, na ktorej przestal. Drog jest wiele.
Pozdrawiam panczo
zarafiq@poczta.onet.pl - 14-11-2006 00:09
> > 500 MB ramu to trochę mało. > > Przyjrzyj się narzędziu SQL*Loader (sqlldr.exe). > > > > oczywiscie malo, jesli chce sie zaladowac caly plik do pamieci. Robilem
Miałem na myśli apetyt Oracle ;)
> podobna rzecz z plikiem wsadowym w MSSQL, ktory byl podobnych rozmiarow. > Dla niego napisalem wlasny parser w Javie, ktory otwieral plik i
Po co pisać parser? Jeśli format pliku jest w miarę normalny wystarczy napisać plik konfiguracyjny dla sqlldr.
Pozdrawiam zarafiq
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
mwgomez - 14-11-2006 00:11
> Przyjrzyj się narzędziu SQL*Loader (sqlldr.exe).
Przede wszystkimn dziękuję wszystkim za pomoc.
Na początek spróbowałem użyć "sqlldr.exe", to jest dokładnie to o co mi chodzi (szybkosc na prawdę imponująca), natomiast mam pytanie. Wczytuję w ten sposób powiedzmy 3 pliki po 100 wierszy każdy, ale odnoszę wrażenie, ze w tabeli oracle'a ma tylko ostatnia porcję (czyli ostatnie 100 wierszy z trzeciego pliku), a ja chciałbym żeby mi się to do tabeli dodawało.
Pozdrawiam
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Michał Kuratczyk - 14-11-2006 00:11
mwgomez wrote: > Na początek spróbowałem użyć "sqlldr.exe", to jest dokładnie to o co mi > chodzi (szybkosc na prawdę imponująca) Tu masz porównanie sqlldr versus external tables. http://asktom.oracle.com/pls/ask/f?p...:6611962171229
Generalnie wydajność jest zbliżona, albo wręcz lepsza w przypadku external tables, co w połączeniu z ich elastycznością wydaje się lepszym rozwiązaniem.
-- Michał Kuratczyk
zarafiq@poczta.onet.pl - 14-11-2006 00:56
[...] > a ja chciałbym żeby mi się to do tabeli dodawało.
into_table1 ::=
INTO TABLE name [ ( { PARTITION name | SUBPARTITION name } ) ] { INSERT | REPLACE | TRUNCATE | APPEND }
Pozdrawiam zarafiq
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
mwgomez - 14-11-2006 00:56
Bardzo dziękuję za pomoc!
Pozdrawiam
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Wito - 17-11-2006 07:13
Zeosach da sie wykonać kilka instrukcji SQL jednocześnie; Skorzystaj z komponentu ZProsessor (gdzies pod koniec palety), wlasciwości Script, jest tam również wlasciwośc odpowiedzialna za znak rozdzielający poszczególne instrukcje
Wito
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
Oracle 19g +Insert +Insert +Insert...
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[Oracle] jak =?ISO-8859-2?Q?ograniczy=E6_pami=EA=E6_dla_se?==?ISO-8859-2?Q?rwera=3F?=
=?ISO-8859-2?Q?=5BOT=5D_Zdany_egzamin_Oracle_1Z0-007_a?==?ISO-8859-2?Q?_brak_informacji_na_stronie_Prometric_-_czy?==?ISO-8859-2?Q?_co=B6_nie_tak=3F?=
[oracle] czy da =?ISO-8859-2?Q?si=EA_z_poziomu_procedury_?==?ISO-8859-2?Q?zrobi=E6_kopi=EA_zapasow=B1=3F?=
[oracle 10g] czy =?ISO-8859-2?Q?mo=BFna_wy=B3=B1czy=E6_wszys?==?ISO-8859-2?Q?tkie_wi=EAzy_w_schemacie=3F?=
=?iso-8859-2?q?[oracle]_Jak_sprawdzi=E6_wielko=B6=E6_tabeli_=3F=3F?=
=?ISO-8859-2?Q?Poszukjue_ksi=B1=BFki_"Oracle_?= =?ISO-8859-2?Q?optymalizacja_wydajno=B6ci"..?=
[Oracle] =?ISO-8859-2?Q?=A3=B1czenie_wierszy_z_zapytania_?==?ISO-8859-2?Q?w_jeden_string?=
zanotowane.pldoc.pisz.plpdf.pisz.plponland.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|