starter
Goto Top

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

Content-ID: 80246

Url: https://administrator.de/forum/abfragezeit-unverhaeltnismaessig-gross-beim-anfuegen-einer-neuen-tabelle-80246.html

Ausgedruckt am: 23.12.2024 um 03:12 Uhr

AndreasHoster
AndreasHoster 08.02.2008 um 12:12:42 Uhr
Goto Top
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.
starter
starter 08.02.2008 um 14:45:15 Uhr
Goto Top
super, vielen Dank für die schnelle Antwort.
Ich habe soeben Variante 1 Probiert und quasi die erste Abfrage als solches in die zweite integriert. Durch die erste Abfrage erhalte ich ja meine 30 Sätze (=4 sek). Verknüpft mit der zweiten Abfrage rödelt er wieder eine ewigkeit herrum. Ich habe nun nach einer Stunde abgebrochen.

Zu den Randinformationen:
1. ODBC auf 5 Tabellen mit Access 2000
2. Jede Tabelle hat zwischen 26.000 und 250.000 zeilen und zwischen 10 und 40 Spalten

Hier mal die SQL Anweisung. Für die erste Abfrage (4sek):

SELECT [Artikelnr zu Objekey].KD_VORGANGS_NR, [Artikelnr zu Objekey].POSITIONS_NR, [Artikelnr zu Objekey].ARTIKEL_NR, [Artikelnr zu Objekey].AUFTRAGSMENGE, PROD6_PFGJ.RM_GUT_MENGE, PROD6_PFGJ.BELEGUNGSEINHEIT_NR, PROD6_PFGJ.LETZTE_RUECKMELDUNG, [AC Modul].SACHMWERT, [AF Gangzahl].SACHMWERT, [AH Qualität].SACHMWERT, [BB Außendurchmesser].SACHMWERT, [BD Nutzlänge].SACHMWERT, [BC Gesamtlänge].SACHMWERT, [BE Bohrungsdurchmesser].SACHMWERT, [BG Anzahl Spannuten].SACHMWERT, [BH Spanwinkel].SACHMWERT, [BL Werkstoff].SACHMWERT
FROM [BL Werkstoff] INNER JOIN ([BH Spanwinkel] INNER JOIN ([BG Anzahl Spannuten] INNER JOIN ([BE Bohrungsdurchmesser] INNER JOIN ([BD Nutzlänge] INNER JOIN ([BC Gesamtlänge] INNER JOIN ([AC Modul] INNER JOIN ([AF Gangzahl] INNER JOIN ([AH Qualität] INNER JOIN ([BB Außendurchmesser] INNER JOIN (PROD6_PFGJ INNER JOIN [Artikelnr zu Objekey] ON PROD6_PFGJ.RUECKMELDE_NR = [Artikelnr zu Objekey].RUECKMELDE_NR) ON [BB Außendurchmesser].OBJKEY = [Artikelnr zu Objekey].Ausdr1) ON [AH Qualität].OBJKEY = [BB Außendurchmesser].OBJKEY) ON [AF Gangzahl].OBJKEY = [AH Qualität].OBJKEY) ON [AC Modul].OBJKEY = [AF Gangzahl].OBJKEY) ON [BC Gesamtlänge].OBJKEY = [AC Modul].OBJKEY) ON [BD Nutzlänge].OBJKEY = [BC Gesamtlänge].OBJKEY) ON [BE Bohrungsdurchmesser].OBJKEY = [BD Nutzlänge].OBJKEY) ON [BG Anzahl Spannuten].OBJKEY = [BE Bohrungsdurchmesser].OBJKEY) ON [BH Spanwinkel].OBJKEY = [BC Gesamtlänge].OBJKEY) ON [BL Werkstoff].OBJKEY = [BH Spanwinkel].OBJKEY
WHERE (((PROD6_PFGJ.BELEGUNGSEINHEIT_NR)=150002 Or (PROD6_PFGJ.BELEGUNGSEINHEIT_NR)=160002 Or (PROD6_PFGJ.BELEGUNGSEINHEIT_NR)=170002) AND ((PROD6_PFGJ.LETZTE_RUECKMELDUNG) Between "20080107" And "20080111"));


Ergeben also meine 30 Sätze.


und nun soll einfach nur noch der WERKSTOFF hinzu der in der Tabelle PART zu finden ist. Der Schlüssel ist die hier die Artikel_NR


OK ich gebe zu die erste Abfrage habe ich hier sark zusammengefasst beschrieben. Aber immerhin nur 4 Sek.

Grüße
AndreasHoster
AndreasHoster 08.02.2008 um 15:06:06 Uhr
Goto Top
Das bedeutet, daß er zum Raussuchen der passenden Zeilen aus Tabelle Part so lange braucht.

Ist das Feld der Tabelle Part, welches für den Join verwendet wird, alleiniger Primärschlüssel, bzw. liegt ein alleiniger Index auf dem Feld?
starter
starter 08.02.2008 um 15:12:57 Uhr
Goto Top
Die Tabelle part ist der Artikelstamm und der Primärschlüsse ist die Artikel_Nr. Ich würde behaupten dass im ganzen System sich keine Tabelle besser für diesen Primärschlüssel eignen würde.

Ich habe das Gefühl, dass Access mit der Datenmenge schlicht und einfach überforder ist. Ich habe versucht die SQL Anweisung in Toad einzufügen. Aber meine Oracle-Datenbank kennt wohl kein INNER JOIN... Aber wie macht das dann Access??
AndreasHoster
AndreasHoster 08.02.2008 um 16:03:22 Uhr
Goto Top
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.
starter
starter 08.02.2008 um 16:14:56 Uhr
Goto Top
Hmm das sind ja nur ein paar Tabellen von der DB... aber was heißt eigentlich MDB? ?=Microsoft-DB?? Wir haben doch eine Oracle DB... und die ist so ca 6 GB groß...

Das Raussuchen via Access und ODBC in part ist in sekunden schnelle passiert ...

Wenn das Inner Join sonst nichts anderes macht bin ich beruhigt...

Wie schon geschrieben denke ich, dass da Access an die grenzen kommt, obwohl ich mir das nicht so richtig vorstellen kann .... (von übrgigebliebenen 30 Dateien aus einer anderern Tabelle einen Wert raussuchen) Villeicht liegt es doch an mir.....

Vielen Dank schon mal für die HIlfe
AndreasHoster
AndreasHoster 08.02.2008 um 16:33:08 Uhr
Goto Top
Ä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.
starter
starter 09.02.2008 um 22:10:29 Uhr
Goto Top
Ah ok, und wie kann ich auf die Oracle-DB ein view ausführen? Kann ich das mit Access? Ich dachte dadurch dass ich die Tabellen per ODBC verknüpft habe lade ich so gut wie nichts rüber!? Sorry für die Frage aber ich kenne mich noch nicht so gut mit Access und DB's aus.
AndreasHoster
AndreasHoster 09.02.2008 um 22:47:01 Uhr
Goto Top
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.