Od czasu pojawienia się zadań integracji danych między systemami często pojawia się pytanie o programową synchronizację: należy aktualizować tylko rzeczywiście zmienione wiersze, oszczędzając zasoby i minimalizując blokady. Standardowe podejście w przeszłości polegało na pełnej wymianie lub ręcznym wyszukiwaniu różnic, co marnowało zbędne operacje i prowadziło do błędów.
Problem: podczas synchronizacji trzeba wykryć i zaktualizować tylko zmienione dane, a nie wszystkie wiersze. Jest to ważne dla wydajności, ruchu sieciowego i integralności, szczególnie przy dużych objętościach lub rozproszonych bazach.
Rozwiązanie: zazwyczaj realizuje się porównanie tabeli źródłowej i docelowej za pomocą operatorów JOIN, oblicza różnice przez HASH lub sumę kontrolną, aktualizuje tylko "zdeformowane" wiersze za pomocą MERGE (lub UPSERT) lub specjalnych wyzwalaczy.
Przykład kodu (na SQL Server):
MERGE target_table AS t USING source_table AS s ON t.id = s.id WHEN MATCHED AND (t.name <> s.name OR t.value <> s.value) THEN UPDATE SET t.name = s.name, t.value = s.value WHEN NOT MATCHED BY TARGET THEN INSERT (id, name, value) VALUES (s.id, s.name, s.value);
Kluczowe cechy:
Czy MERGE zawsze gwarantuje brak wyścigów przy jednoczesnych aktualizacjach?
Nie, jeżeli nie ma dodatkowej kontroli transakcji, możliwe jest pojawienie się wyścigów (race condition). Dla maksymalnej poprawności używaj odpowiedniego poziomu izolacji transakcji.
Czy można użyć UPDATE ... JOIN zamiast MERGE do skomplikowanej synchronizacji?
Często można, ale takie podejście nie pozwala dodać nowych wierszy do tabeli docelowej. Tylko MERGE/UPSERT aktualizuje i dodaje.
UPDATE t SET t.name = s.name, t.value = s.value FROM target_table t JOIN source_table s ON t.id = s.id WHERE t.name <> s.name OR t.value <> s.value;
Co zrobić, jeśli synchronizowane tabele mają niezgodne zestawy kolumn?
Zaleca się wyraźne wymienienie odpowiadających sobie pól i nie próbowanie aktualizować "zawsze wszystkich" pól. W razie potrzeby używaj map- tabel lub konwersji.
Inżynier ETL "ładuje" dane za pomocą prostego UPDATE wszystkich rekordów po kluczu: tabela na dziesiątki milionów wierszy, proces zajmuje godziny i blokuje serwer. Brak oddzielnego wstawiania nowych wierszy, tracone są świeże dane.
Zalety:
Wady:
Specjalista przed ładowaniem oblicza sumy kontrolne wierszy, filtruje zmienione rekordy, używa MERGE do szybkiej synchronizacji i przetwarzania nowych wierszy. Proces przebiega w kilka minut bez przeciążenia.
Zalety:
Wady: