W bazie danych trzymam 250tys. produktów, które zostały pobrane z zewnętrznego serwera. Raz dziennie muszę sprawdzać, czy nie pojawiły się w ofercie nowe produkty. Zewnętrzny serwer podsyła mi dane w pakietach po 100 produktów. Każdy produkt posiada unikalne ID (zarówno zewnętrzne jak i wewnętrzne). W przypadku, gdyby tych produktów było niewiele, wystarczyłoby pobrać 100 ID z zewnętrznego serwera do tablicy A, produkty z bazy danych do tablicy B i prostą funkcją znaleźć różnice w dwóch tablicach. Problemem w moim wypadku jest dość znaczna wielkość danych oraz serwowanie ich w pakietach od strony zewnętrznego serwera. Mógłby mi ktoś podpowiedzieć, jak najlepiej rozwiązać ten problem? Co rozumiem przez najlepiej, wyjaśnię pod koniec. Moje warianty rozwiązań znajdują się poniżej (jest to to, co samemu udało mi się wymyślić na szybko - proszę się tym nie sugerować zupełnie):
1. Pobrać pakiet 100 produktów z serwera, sprawdzić SELECT ... IN, które mam w bazie danych i dodać te, których nie mam. Wady: 2500 zapytań SELECT ... IN, które chyba niezbyt dobrze radzi sobie z indeksami (chodzi mi o klauzulę IN).
2. W zasadzie wariant powyższy, ale złączyć kilka pakietów z serwera zewnętrznego i dopiero wysłać zapytanie do bazy. Co prawda liczba zapytań maleje, ale zwiększa się zakres w IN.
3. Pobrać 250tys. produktów z serwera zewnętrznego, posortować po ID i zapisać do pliku np. XML albo txt. Pobrać 250tys. produktów z bazy danych, posortować po tym samym ID i zapisać do pliku. Odczytywać to sekwencyjnie i porównywać na bieżąco. Wady: nie wiem, czy nie zajadę dysku przy tak dużym odczycie i zapisie danych na dysk oraz czy wystarczy pamięci, by posortować po ID dane z serwera zewnętrznego.
Najlepsze rozwiązanie dla mnie to takie, które w dość rozsądny sposób będzie używało zasoby serwera. Sama szybkość działania nie jest tak istotna, jak zasobożerność serwera, gdyż całość pewnie będzie na hostingu.