2016-01-15 32 views
8

Mam bazę danych Oracle i bazę danych SQL Server. Istnieje jedna tabela, na przykład Inventory, która zawiera miliony wierszy w obu tabelach bazy danych i stale rośnie.Porównaj miliony rekordów z Oracle do SQL Server

Chcę porównać dane tabeli Oracle z danymi SQL Server, aby dowiedzieć się, których rekordów brakuje w tabeli SQL Server codziennie.

Który jest najlepszy sposób na to?

  1. Utwórz pakiet SSIS.
  2. Utwórz usługę Windows.

Chcę spożywać mniej zasobów, aby uzyskać tę funkcjonalność, która zajmuje mniej czasu i mniej zasobów.

Np: 18 milionów rekordów w Oracle i 16/17 miliony w SQL Server

Ta sytuacja z dwoma różnymi bazie powstają z powodu dwóch różnych aplikacji online i offline

EDIT: Jak o podłączenie serwera SQL od Oracle przez Bramę Oracle do serwera SQL do

1) Bezpośrednie zapytanie do serwera SQL od Oracle w celu aktualizacji brakującego rekordu na serwerze SQL po raz pierwszy.

2) Utwórz wyzwalacz na Oracle, który zostanie wykonany, gdy rekord zostanie usunięty z Oracle i wstawi usunięty rekord do nowej tabeli oracle.

3) Utwórz pakiet SSIS, aby zmapować nowo utworzoną tabelę oracle z serwerem SQL, aby zaktualizować rekord serwera SQL. W ten sposób tylko kilka rekordów musi przetwarzać codziennie przez SSIS.

Co sądzisz o tym podejściu?

+0

Myślę, że dobrą długoterminową strategią byłoby nie przechowywać Państwa przez różne RDBMS. Czy mógłbyś zaktualizować pytanie wyjaśniające, w jaki sposób skończyłeś z tym problemem? –

+0

Czy możesz nam wyjaśnić, w jaki sposób rekordy są obecnie duplikowane? – Giova

+0

Baza danych Oracle ma wszystkie rekordy .. i istnieje możliwość, że rekordy zostaną usunięte z bazy Oracle i musimy zaktualizować rekordy serwera SQL, które zostały usunięte z bazy oracle – Mahajan344

Odpowiedz

0

Inne alternatywy:

Jeśli można użyć bramy Oracle SQL Server wtedy nie trzeba przesyłać dane i mogą bezpośrednio zapytanie.

Jeśli nie możesz użyć bramki Oracle, możesz użyć integracji danych Pentaho lub innego narzędzia ETL do porównania tabel i uzyskania wyników. Jest łatwy w użyciu.

+0

Twoja odpowiedź jest dość ogólnikowa, przynajmniej dla mnie, ponieważ nie daje żadnej wskazówki, jak to osiągnąć. Weź również pod uwagę, że jedna aplikacja jest w trybie offline. – hotzst

+0

Witam. Zasugerowałem jedynie alternatywę dla przesyłania danych za pomocą procedur. Z bramką oracle dla SQLServer możesz wykonać porównanie bezpośrednio. To samo z narzędziem ETL, ale ta alternatywa jest inna. – JLC

1

Utworzę pakiet SSIS i załaduję dane z tabeli Oracle za pomocą źródła danych/źródła danych OLE DB. Jeśli masz SQL Enterprise, złącza Attunity są nieco szybsze.

Następnie załadowałbym klucz z tabeli SQL Server do transformacji odnośnika, gdzie dopasowałbym 2 źródła na kluczu i wyreżyserowałem niedopasowane wiersze do osobnego wyjścia.

W końcu skieruję niepoprawne dane wyjściowe wierszy do polecenia OLE DB, aby zaktualizować tabelę SQL Server.

Ten pakiet SSIS będzie wymagał dużej ilości pamięci, ale gdy dopasowywanie odbywa się w pamięci przy minimalnym IO, prawdopodobnie przewyższy inne szybkości. Będzie potrzebował wystarczającej ilości wolnej pamięci do buforowania wszystkich kluczy z tabeli SQL Server.

SSIS ma także tę zaletę, że oferuje wiele innych funkcji transformacji, jeśli są potrzebne później.

+0

Dziękuję za odpowiedź. Sugerujesz więc, że pakiet SSIS jest najlepszym podejściem do porównania 18 milionów rekordów oracle z 15/16 milionami rekordów serwera SQL z wyszukiwaniem SSIS? – Mahajan344

+0

Tak, ze względu na minimalną wartość we/wy. SSIS musi tylko raz odczytać dane z tabel Oracle i SQL Server, a następnie dopasuje się do pamięci, gdzie większość innych technik wymaga odczytywania i zapisywania (a następnie ponownego czytania) jednego z dużych zestawów danych. –

+0

Nie sądzę, że wyszukiwanie SSIS będzie w stanie obsłużyć ten wolumin (cieszę się, że mogę to poprawić). Jeśli jest jakikolwiek stopień złożoności (tj. Rozróżnianie wielkości liter lub zakresów), musi on wykonywać wyszukiwanie wiersz po wierszu, który będzie bardzo powolny dla 18 milionów rekordów. –

0

Myślę, że najlepszym sposobem jest użycie bramy oracle. Wystarczy wykonać kroki. Mam podobny rodzaj doświadczenia.

  1. Zainstaluj i skonfiguruj bazę danych Oracle dla SQL Server. https://docs.oracle.com/cd/B28359_01/gateways.111/b31042/installsql.htm
  2. Teraz możesz utworzyć dblink z oracle na serwer sql.
  3. Utwórz procedurę, która porówna brakujące rekordy w bazie danych Oracle i wstaw do bazy danych serwera sql.

Na przykład możesz użyć tego oświadczenia w swojej procedurze.

INSERT INTO "dbo"."sql_server_table"@dblink_name("column1","column2"...."column5") 
VALUES 
(
    select column1,column2....column5 from oracle_table 
    minus 
    select "column1","column2"...."column5" from "dbo"."sql_server_table"@dblink_name 
) 
  1. Tworzenie harmonogramu, które realizują procedurę codziennie.

Gdy obie bazy danych są w trybie online, brakujące rekordy zostaną wstawione do serwera sql. W przeciwnym razie program planujący ulegnie awarii lub można ręcznie wykonać tę procedurę. Wymaga minimum zasobów.

1

Co zasadniczo chcesz zrobić, to replikacja z Oracle do SQL Server.

Można to zrobić w SSIS, Windows Service lub w wielu różnych platformach. Prawdziwa sztuczka polega na użyciu prawidłowego wzorca projektowego.

Istnieją dwa ogólne wzorce projektowe

  1. Migawka replikacja

wziąć wszystkie rekordy z obu systemów i porównać je gdzieś (do tej pory mamy propozycje dla porównania w SSIS lub porównać na Oracle, ale nie jest to jeszcze sugestia do porównania na serwerze SQL, chociaż jest to ważne)

Porównywasz 18 milionów rekordów, więc jest to dużo pracy

  1. różnicowego replikacji

nagrać zmiany wydawcy (czyli Oracle) od czasu ostatniej replikacji, następnie zastosowanie tych zmian do subskrybenta (np. SQL Server)

Możesz to zrobić ręcznie, wprowadzając wyzwalacze i tabele log po stronie Oracle, a następnie użyj zwykłego procesu ETL (SSIS, linia poleceń narzędzia, pliki tekstowe, cokolwiek), prawdopodobnie zaplanowane w SQL Agent, aby zastosować je do SQL Server.

Albo można to zrobić za pomocą Out of the box zdolności replikacji skonfigurować Oracle jako wydawca i SQL jako subskrybenta: https://msdn.microsoft.com/en-us/library/ms151149(v=sql.105).aspx

Będziesz musiał spróbować kilka z nich i zobaczyć co działa dla ciebie.

Biorąc pod uwagę ten cel:

Chcę zużywają mniej zasobów, aby osiągnąć tę funkcjonalność, która zajmuje mniej czasu i mniej zasobów

replikacji transakcyjnej jest znacznie bardziej efektywny, ale skomplikowane. Do celów konserwacji, które platformy (.Net, SSIS, Python itp.) Są ci najbardziej wygodne?

0

Zasugeruję wykonanie domowej roboty rozwiązania ETL.

  1. zaplanować oracle job eksportować dane z tabeli źródła (na co dzień sposób oparty na logice aplikacji) format to plain CSV.
  2. Zaplanuj SQL-Server job (z możliwym do zaakceptowania opóźnieniem od pierwszego zlecenia), aby odczytać ten plik CSV i zaimportować go do średniej tabeli wewnątrz sql-servter przy użyciu BULK INSERT.
  3. Ostatnia część zadania SQL-Server będzie odczytywać dane tabeli średniej i wykonać logikę (wstaw, zaktualizuj tabelę docelową). Sugeruję posiadanie innej tabeli do przechowywania raportów z tego codziennego wyniku pracy.