ďťż
 
Jak wciągnąć dużą porcję danych do bazy danych Oracle 10 g Express ďťż
 
Jak wciągnąć dużą porcję danych do bazy danych Oracle 10 g Express
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • ponland.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com