Obiekty:
1. Baza danych o nazwie REMOTE_DB.
2. Widok o nazwie ACCOUNTS_VW w bazie REMOTE_DB
3. Baza danych LOCAL_DB
4. Tabela o nazwie LOCAL_ACC_INFO_TAB w bazie LOCAL_DB.
Założenia:
ad. 1 Do bazy REMOTE_DB mam dostęp tylko z poziomu klienta DB2 i tylko do odczytu. Nie mogę tworzyć żadnych obiektów w tej bazie.
ad. 2 Widok ACCOUNTS_VW zawiera niecałe 6 milionów rekordów. Rekord składa się z 50 kolumn. Kluczem jest pole ACC_ID
ad. 3 LOCAL_DB to baza do której jestem administratorem. Mam do niej pełny dostęp z poziomu OS, klienta itd.
ad. 4 Tabela LOCAL_ACC_INFO_TAB to lokalny podzbiór widoku ACCOUNTS_VW. Zawiera 18 tys. rekordów, 10 kolumn, kluczem jest pole ACC_ID.
Potrzeba:
Raz w tygodniu odświeżyć dane w tabeli LOCAL_ACC_INFO_TAB danymi pobranymi z widoku ACCOUNTS_VW (dla istniejących lokalnie kluczy ACC_ID).
Aktualne rozwiązanie:
1. EXPORT TO IXF 'file' FROM REMOTE_DB
SELECT col1, col2, ... , col10 FROM ACCOUNTS_VW WHERE colN = 'something'
- powoduje pobranie około miliona rekordów ze zdalnej bazy danych do pliku na dysku lokalnym.
2. LOAD REPLACE FROM IXF 'file' TO LOCAL_TMP_TABLE
- wczytuje dane z pliku do tymczasowej tabeli.
3. UPDATE loc
SET loc. col2 = rem.col2,
....
FROM
LOCAL_ACC_INFO_TAB loc
inner join
LOCAL_TMP_TABLE rem
ON loc.ACC_ID = rem.ACC_ID
- odświeżam 18 tys. rekordów z tymczasowej tabeli.
Wady:
1. Ściągam z bazy zdalnej 1 mln rekordów mimo, że potrzebuję 18 tys.
2. Wśród tego miliona nie ma wszystkich potrzebnych.
Alternatywa:
Stworzyłem nickaname (używając federacji) w localnej bazie danych. Dzięki temu mogę wykonać joina:
SELECT ACCOUNTS_VW.*
FROM ACCOUNTS_VW inner join LOCAL_ACC_INFO_TAB on loc.ACC_ID = rem.ACC_ID
To pozwala mi zdobyć dane dla dokładnie tych 18 tysięcy ACC_ID dla których potrzebuję.
Ale jest piekielnie wolne (2,5 godziny), ponieważ DB2 realizuje to w następujący sposób:
- ściąga 6 milionów rekordów z bazy zdalnej,
- sortuje je,
- robi 'merge join' lokalnie.
Szukam rozwiązania, które pozwoli ściągnąć ze zdalnej bazy dokładnie te 18 tysięcy rekordów, których potrzebuję. Czy istnieje jakiś sposób, żeby zmusić DB2 do wysłania lokalnych kluczy na serwer zdalny, tak aby join wykonał się tam i zwrócił mi tylko potrzebne wyniki?