Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przeprojektowanie bazy i konsekwencje
Forum PHP.pl > Forum > Bazy danych > Access
torbicki65
Witam
Trochę przynudzę, ale będę bardzo wdzięczy za przeczytanie problemu.

Problem jest taki - spotkałem się z pewną bazą danych w Accessie, która jest o tyle specyficzna, że bardzo niezoptymalizowana.
Generalnie są 4 główne tabele, które nie posiadają żadnych relacji, mają multum nadmiarowości, każda ma ok 5-6 pól tekstowych, które się powtarzają. Cała baza w chwili obecnej zajmuje ok 300 MB. Czary goryczy dopełnia fakt, że baza danych umiejscowiona jest na serwerze w sieci, do którego jest dostęp z naprawdę marną prędkością.

I teraz do rzeczy. Wziąłem pod ostrzę jedną z tabel (6 pól tekstowych, brak kluczy), która zajmowała ok 31 MB, po przeprojektowaniu na tabele z relacjami jej rozmiar spadł do 21 MB. Rzecz jasna teraz nie ma już łatwego podglądywania całej tabeli z widoku tabeli, tylko służy do tego kwerenda.

Operując na dysku lokalnym, wyświetlenie takiej tabeli (nie pamiętam dokładnie, ale chyba ok. 300 tys. rekordów, teraz są same pola numeryczne) złączeniami zajmowało 0,1 sekundy, w starym formacie (czyli bez relacji) 0,6 sekundy. Pomiaru dokonałem przez makro VBA (funkcja Timer).

Pytanie 1: Czy operując na pliku na dysku sieciowym, zapytanie kwerenda będzie wykonywana po stronie serwera i ściągany na lokalny komputer będzie tylko wynik zapytania?

Kontynuując:
Wszystko ładnie pięknie, bo prawdopodobnie będzie można oszczędzić sporo zasobów (szczególnie przy tej największej tabeli, zakładam, że ponad 50%. Teraz nie pamiętam ile ma rekordów, jutro zapiszę sobie te dane), ale nurtuje mnie problem z wydajnością przy pewnych cyklicznych operacjach.

Schemat wygląda następująco - z serwera zewnętrznego na lokalny komputer są pobierane pewne dane (z reguły kilkanaście tys. wierszy na raz) do Excela i odpowiednia kwerenda dodaje dane z pliku xls do tabeli. Problem polega na tym, że te dane są tekstowe (czyli dokładnie tak jak w starym układzie w tabeli). Jako, że chciałbym, aby wszystko było optymalnie, niektóre z tych danych (np. miasto, nazwa firmy itd.) chciałbym zastąpić odpowiadającymi im identyfikatorami liczbowymi. Tu dochodzi problem polegający na tym, że dana wartość może wystąpić pierwszy raz w tych tabelach pomocniczych i będzie trzeba ją dodać.

W mojej głowie pojawiło się takie rozwiązanie problemu, podam przykład dla jednego pola, które ma relację z innym w tabeli pomocniczej.
1. Zaimportować gotowe dane z Excela do tymczasowej tabeli w w bazie.
2. Znaleźć rekordy (JOIN z warunkiem != jeśli dobrze pamiętam) wg pola tekstowego, których nie ma w tabeli pomocniczej.
3. Dodać te wartości do tabeli pomocniczej.
4. Zamienić wartości tekstowe w tabeli tymczasowej na odpowiadające im indeksy z tabeli pomocniczej (UPDATE z JOIN) i przekonwertowanie typu pola.
5. Rekordy z tabeli tymczasowej (już w poprawnej formie) dodać do głównej tabeli.

Czy istnieje szybsze i lepsze rozwiązanie problemu? Chciałbym nadmienić, że całość będzie odbywała się niestety po sieci, więc przydałoby się także, aby zoptymalizować to pod kątem szybkości wykonywania (niestety chyba nie przeskoczę importu danych z Excela).

pozdrawiam serdecznie
prachwal
wszystko co związane z plikami .mdb lub accdb jest wykonane po stronie klienta

jak chcesz szybko to MSSQL 2008 Express R2 i mechanizm danych zewnętrznych w Excel-u, w zasadzie nie trzeba niczego programować, tylko podmieniasz SQL-e w odpowiednich obiektach, a jak skorzystasz z parametryzowanego MS Query to nawet tego nie robisz

oczywiście wszystko jest wtedy wykonane po stronie serwera
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2021 Invision Power Services, Inc.