update z mssql do mysql

0

Witam,
posiadam dwie bazy danych [MSSQL] i [MYSQL].
Obydwie mają te same tabele.
No i chciałbym teraz zaktualizować dane w bazie MYSQL.
Stworzyłem więc obiekt linked serwers (łącze się tam z bazą MYSQL poprzez ODBC).
Poprzez zapytanie zapisuję do tabeli indeksy produktów, które różnią się pomiędzy MS a MY.

insert into tabela_chwilowa select b.id from OPENQUERY(mysql, ''select id,nazwa,cena from test")  a, test b where a.id=b.id and a.nazwa<>b.nazwa

A teraz chciałbym zaktualizować dane w MY.
przykład1:

update  OPENQUERY(mysql, ''select id,nazwa,cena from test")  set
nazwa=b.nazwa from test b where id=b.id and id in (select id from tabela_chwilowa)

przykład2:

declare abc cursor for 
select a.id,b.nazwa from tabela_chwilowa a,test b where a.id=b.id
open abc
fetch next from abc into @id,@nazwa
while @@fetch_status=0
begin
EXEC('update test set nazwa=? where id=?',@nazwa,@id) AT [mysql]
fetch next from abc into @id,@nazwa
end

Oczywiście obydwa przykłady działają, ale niestety BARDZO WOLNO,
ponieważ do poprawienia jest około 100 000 rekordów.
Czy macie jakiś inny sposób aby to przyśpieszyć ?
Zastanawia mnie, w jaki sposób to działa w programach z rodzaju SQL Compare.

Z góry dzięki za wszelką pomoc :)

0

Czy masz zrobione indeksy na wszystkich polach wymienionych w części WHERE?

0

Tak, mam zrobione na wszystkie kolumny.

0

Czy tutaj musi być robiony kursor dla osobnego update dla każdego wiersza? Nie można to zrobić jedną instrukcją update bez otwierania kursora? Jeśli jednak nie można, to spróbuj zrobić to samo przez procedurę przechowywaną na poziomie bazy danych, która powinna zrobić to szybciej. Inna możliwość to zatwierdzanie transakcji co 100 zmian a nie po każdym rekordzie. Nie znam składni tego języka więc mówię ogólnie.

0
urbiasz napisał(a)

do poprawienia jest około 100 000 rekordów

100 000 update'owanych rekordów w kursorze = 100 000 update'ów... Update jest kosztowną operacją stąd też tak długi czas wykonania.

0

rozwiązałem (pomogli mi na wss) to zadanie za pomocą:
bcp - ładowanie danych do pliku csv
ftp - przesyłanie pliku na serwer
LOAD DATA LOCAL INFILE - ładowanie danych z pliku do tabeli
no i w końcu update :)

trwa to około 2-3 min :) a nie jak wcześniej 1,5 do 2 godzin !

1 użytkowników online, w tym zalogowanych: 0, gości: 1