Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Geschwindigkeit bei Auswertung einer externen Datenbank

Begonnen von seppi, März 22, 2016, 08:40:46

⏪ vorheriges - nächstes ⏩

seppi

Hallo zusammen

Ich habe in meinem Access-Projekt Verknüpfungen zu einer externen Access-Datenbank. Auf die ex. DB habe ich keinen Einfluss. In meinem Projekt analysiere ich Daten aus der ex. DB.

Was ist effizienter:
1: Ich hole mir die erforderlichen Daten mit einem Query in meine Auswertung (qryGrunddaten)
    oder
2: ich greife immer auf die Originaldaten zu (SELECT artikel, umsatz... from EXTERNE_DB)
    oder
3: ich hole mir die erforderlichen Daten einmalig mit einem Query eine neue Tabelle in meinem Projekt
    (INSERT  artikel, umsatz... INTO tblGrunddaten) ?

Kann man da eine generelle Aussage machen?

Danke und Gruss, Seppi

Wurliwurm

Generelle Aussagen dazu: Die Verarbeitung der Anfrage findet bei einer Jet-Datenbank immer auf dem Client statt. Damit unterscheiden sich Alternativen 1 und 2 in Bezug auf Performance nicht. Es müssen immer die ganzen Daten über das Netz, lediglich bei indexierten Feldern kann das Jet eine Vorselektion machen, was alles heruntergeladen werden muss. Jet ist vom grundsätzlichen Design dafür konzipiert, dass Daten und Präsentation auf dem gleichen PC liegen. Die Alternative 3 kann hilfreich sein, wenn man einen größeren Datenbestand auswertet und dabei nicht auf ganz aktuelle Daten angewiesen ist.

Bitsqueezer

Hallo,

Du solltest dabei erst mal beschreiben, um was es geht, generelle Aussagen helfen nicht so viel, wenn es auf Deine Situation dann nicht zutrifft.

Da Du von lokalen Abfragen sprichst, nehme ich mal an, daß Du nicht wirklich ein Access-Projekt meinst, das wäre eine ADP-Datei, die mit einem SQL Server verbunden ist und keine lokalen Ressourcen (Abfragen/Tabellen) kennt. Wenn es sich um eine ADP handeln würde, würde ich eine Linked-Server-Einstellung auf dem SQL Server empfehlen und dort die externen Daten der Fremddatenbank verarbeiten.

Wenn es sich um eine normale Access-Datei handelt (MDB/ACCDB), dann hängt es auch davon ab, wie oft sich die externen Daten ändern und wozu Du sie brauchst. Wenn es sich etwa um Stammdaten handelt, die nicht unbedingt auf dem alleraktuellsten Stand sein müssen, dann kann es sich lohnen, diese in eine lokale Tabelle zu replizieren, wobei ich hier nur die geänderten/neuen Daten neu herunterladen würde. Wenn dann lokal auf die Stammdaten zugegriffen werden muß, kann man diese aus der lokalen Tabelle beziehen, sofern die ID des PKs hier mit der des Servers identisch ist (die lokale Tabelle also keine eigene neue ID vergibt).
Sind es Daten, die immer aktuell sein müssen, stellt sich die Frage, ob man mit den Daten mehrere Operationen lokal durchführen möchte, dann wird der Import in eine lokale Tabelle vorteilhafter sein, da man die externen Daten nur einmal zieht aber mehrfach benutzt. Hierzu sollte man allerdings in jedem Fall eine zweite Access-Datei verwenden, die auch lokal liegt, um ein schnelles Anwachsen der Dateigröße zu vermeiden, außerdem hat man dann die vollen 2GB Maximalgröße zur Verfügung für die Daten einer Tabelle.
Willst Du dagegen nur einmalig die Daten holen und verarbeiten und bei der nächsten Abfrage müssen es wieder aktuelle Daten sein, kommt die lokale Tabelle nicht in Frage.
Wenn also immer aktuelle Daten von extern gezogen werden müssen, ist wiederum die Frage, ob die Daten nicht vorab eingeschränkt werden können. Wenn Du also etwa Daten aus einem MySQL-Server ziehen möchtest, solltest Du eine Pass-Through-Abfrage definieren (Achtung: PTs sind immer read-only), da hier das SQL des Zielsystems verwendet wird und über ein sinnvoll formuliertes WHERE die Datenmenge u.U. schon stark eingeschränkt werden kann, was dann alles auf dem Server passiert. Verwendest Du das WHERE erst in einer lokalen Abfrage, müssen erst alle Daten vom Server gezogen und lokal aussortiert werden.

Wenn möglich, solltest Du Dir auf dem Server Views erstellen (lassen), die nur die von Dir benötigten Spalten enthalten und ggf. auch schon durch ein generelles WHERE eingeschränkt werden (etwa "nur aktive Personen" aus der Personaldatenbanktabelle und davon nur Name und Vorname). Damit kannst Du auch eine Pass-Through-Abfrage auf diese View ausrichten und mit eigenem WHERE weiter einschränken. Die gespeicherte View auf dem Server steigert die Performance, da hier bereits Optimierungen durch den DB-Server durchgeführt werden.

Viel mehr kann man allgemein nicht sagen, denke ich.

Gruß

Christian

seppi

Danke für den Input.
Da die Daten 'tagesaktuell' sein sollen, importiere ich die Daten in meine Anwendung. (Solange das zeitlich vertretbar ist.)

Gruss, Seppi