Abfragezeit unverhältnismäßig groß beim anfügen einer neuen Tabelle
Hallo, ich nochmal,
hab ein kleines Verständnisproblem in Access....
Also habe eine Abfrage mit Verknüpfungen zu mehreren Tabellen. Diese Abfrage dauert ca. 4 sek. Füge ich eine weitere relativ große Tabelle an, von der ich nur eine Spalte benötige, dauert die Abfrage 5 Stunden.
Kleines Beispiel:
Tabelle A mit ca 10000 Sätzen
Tabelle B mit ca 5000 Sätzen
Tabelle C mit ca 20000 Sätzen
Bisherige Abfrage:
Finde in Tabelle A die Sätze die in einem Zeitraum zwischen gestern und heute liegen. --> Bleiben ca. 30 Sätze übrig ...... und füge aus Tabelle B das Feld xy zu. .... soweit so gut (Abfrage ca. 4 sek.)
Neue Abfrage:
gleich wie Bisherige Abfrage, aber nun füge aus Tabelle C noch das Feld zz dazu. --> Abfragezeit auf einmal ca. 5 Stunden
Ich glaube dass Access dann hin geht und nicht das Ergebnis aus der bisherigen Abfrage nimmt und sich die Felder in Tabelle C sucht, also mit den gefundenen 30 Sätzen, sondern jeden einzelnen Satz aus Tabelle A (also die 10000) nimmt und die 20000 Sätze aus Tabelle C durch geht.
Nun meine Frage: Wie schaffe ich es, dass Access dann nur die 30 Sätze nimmt um die Tabelle C zu durchsuchen. Gibt es da einen Trick bezüglich der reihenfolge der Verknüpfungen?
Danke schon mal
hab ein kleines Verständnisproblem in Access....
Also habe eine Abfrage mit Verknüpfungen zu mehreren Tabellen. Diese Abfrage dauert ca. 4 sek. Füge ich eine weitere relativ große Tabelle an, von der ich nur eine Spalte benötige, dauert die Abfrage 5 Stunden.
Kleines Beispiel:
Tabelle A mit ca 10000 Sätzen
Tabelle B mit ca 5000 Sätzen
Tabelle C mit ca 20000 Sätzen
Bisherige Abfrage:
Finde in Tabelle A die Sätze die in einem Zeitraum zwischen gestern und heute liegen. --> Bleiben ca. 30 Sätze übrig ...... und füge aus Tabelle B das Feld xy zu. .... soweit so gut (Abfrage ca. 4 sek.)
Neue Abfrage:
gleich wie Bisherige Abfrage, aber nun füge aus Tabelle C noch das Feld zz dazu. --> Abfragezeit auf einmal ca. 5 Stunden
Ich glaube dass Access dann hin geht und nicht das Ergebnis aus der bisherigen Abfrage nimmt und sich die Felder in Tabelle C sucht, also mit den gefundenen 30 Sätzen, sondern jeden einzelnen Satz aus Tabelle A (also die 10000) nimmt und die 20000 Sätze aus Tabelle C durch geht.
Nun meine Frage: Wie schaffe ich es, dass Access dann nur die 30 Sätze nimmt um die Tabelle C zu durchsuchen. Gibt es da einen Trick bezüglich der reihenfolge der Verknüpfungen?
Danke schon mal
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 80246
Url: https://administrator.de/contentid/80246
Ausgedruckt am: 22.11.2024 um 10:11 Uhr
9 Kommentare
Neuester Kommentar
Der SQL Code der Abfrage und die Angabe der Tabellendefinitionen, insbesondere Primarschlüssel und Indexfelder würden bei der Analyse helfen.
Ansonsten zur direkten Beantwortung Deiner Frage:
Einfache und übersichtlichere Variante:
Die jetzige Abfrage stehen lassen und auf diese aufbauend eine weitere Abfrage die die Tabelle 3 hinzufügt. Damit gibt die erste Abfrage erstmal 30 Datensätze zurück und dann kommt erst Tabelle 3.
Kompliziertere Variante:
SQL erlaubt die Definition von Select Statements als virtuelle Tabellen.
ALso sowas:
Select T1.a, VirtuelleTabelle1.b ... from (select ... from T2, T3) as VirtuelleTabelle1, T1
Ich denke aber nicht, daß das Dein Problem ist, sondern das die Verknüpfung zu Tabelle C auf ein nicht indiziertes Feld geht und daher Full Table Scans nötig sind, um die entsprechenden Zeilen zu finden.
Ansonsten zur direkten Beantwortung Deiner Frage:
Einfache und übersichtlichere Variante:
Die jetzige Abfrage stehen lassen und auf diese aufbauend eine weitere Abfrage die die Tabelle 3 hinzufügt. Damit gibt die erste Abfrage erstmal 30 Datensätze zurück und dann kommt erst Tabelle 3.
Kompliziertere Variante:
SQL erlaubt die Definition von Select Statements als virtuelle Tabellen.
ALso sowas:
Select T1.a, VirtuelleTabelle1.b ... from (select ... from T2, T3) as VirtuelleTabelle1, T1
Ich denke aber nicht, daß das Dein Problem ist, sondern das die Verknüpfung zu Tabelle C auf ein nicht indiziertes Feld geht und daher Full Table Scans nötig sind, um die entsprechenden Zeilen zu finden.
Möglich, wie groß ist die MDB denn insgesamt?
Wir haben hier 500 MB MDBs, die gehen gerade noch so.
Aber das Raussuchen von Zeilen per Primärschlüssel sollte deutlich schneller gehen.
Wie schnell geht den eine Abfrage vom Typ:
Select * from part where Artikel_NR='xxxxx' or Artikel_NR='yyyyy'
Zum Inner Join:
Select T1.a, T2.b from T1, T2 where T1.ID=T2.ID
wäre ein Inner Join ohne das Schlüsselwort Inner Join. Das sollte auch Oracle hinkriegen.
Wir haben hier 500 MB MDBs, die gehen gerade noch so.
Aber das Raussuchen von Zeilen per Primärschlüssel sollte deutlich schneller gehen.
Wie schnell geht den eine Abfrage vom Typ:
Select * from part where Artikel_NR='xxxxx' or Artikel_NR='yyyyy'
Zum Inner Join:
Select T1.a, T2.b from T1, T2 where T1.ID=T2.ID
wäre ein Inner Join ohne das Schlüsselwort Inner Join. Das sollte auch Oracle hinkriegen.
Äh, sorry, das ist bei mir nicht angekommen daß Access nur als Frontend verwendet wird.
Und Ok, da gibts ein Problem, Abfragen in Access werden von Access berechnet, damit muß Access erstmal alle Tabellen laden und die Indizes der Oracle DB werden nicht benutzt.
Besser ist es, dies als View auf der Oracle anzulegen. Dann berechnet das die Oracle DB und nicht Access. Spart auch Bandbreite im Netzwerk.
Und Ok, da gibts ein Problem, Abfragen in Access werden von Access berechnet, damit muß Access erstmal alle Tabellen laden und die Indizes der Oracle DB werden nicht benutzt.
Besser ist es, dies als View auf der Oracle anzulegen. Dann berechnet das die Oracle DB und nicht Access. Spart auch Bandbreite im Netzwerk.
Die Tabellen per ODBC verknüpfen bedeutet nur, daß die Daten der Tabellen nicht in der Access MDB Datei liegen, aber bei Abfragen, Suchen, Sortieren macht Access alles selber und muß dazu die ganzen Daten Lesen.
Die View/Sicht musst Du erst auf der Oracle DB anlegen. geht mit jedem Tool das SQL Befehle an die Oracle schicken kann, ich glaube das von Oracle heißt SQL PLUS. Toad sollte auch gehen. Oracle ist halt nicht meine DB.
View anlegen geht mit create view as Select ... und hier das passende Select-Statement.
Danach kannst Du die View wie eine Tabelle per ODBC verbinden. In Access wird das auch als Tabelle dargestellt. Und wenn Du dann Daten aus dieser Tabelle liest, wird auf der Oracle DB die View ausgeführt.
Die View/Sicht musst Du erst auf der Oracle DB anlegen. geht mit jedem Tool das SQL Befehle an die Oracle schicken kann, ich glaube das von Oracle heißt SQL PLUS. Toad sollte auch gehen. Oracle ist halt nicht meine DB.
View anlegen geht mit create view as Select ... und hier das passende Select-Statement.
Danach kannst Du die View wie eine Tabelle per ODBC verbinden. In Access wird das auch als Tabelle dargestellt. Und wenn Du dann Daten aus dieser Tabelle liest, wird auf der Oracle DB die View ausgeführt.