Neuigkeiten:

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

Mobiles Hauptmenü

Performance-Problem beim Bericht ausgeben oder Export

Begonnen von Mehrzweck, April 15, 2016, 10:39:30

⏪ vorheriges - nächstes ⏩

Mehrzweck

Hallo allerseits!
Wir haben im Büro einen SQL-Server, auf welchem unsere Klientenverwaltung läuft. Nun versuche ich, via Access einige Abfragen und Berichte zu generieren, was in der Theorie auch wunderbar klappt. Die Datenbank ist nicht bis ins Detail normalisiert, die Beziehungen musste ich mangels Infos selbst zusammenbasteln in den jeweiligen Abfragen, aber nun wäre ich soweit, dass ich die Daten richtig sortiert habe und gerne ausgeben möchte. Wenn ich meine Abfrage ausführe, zeigt Access die korrekten Daten und dies auch relativ zügig an. Wenn ich die Abfrage aber exportieren (Excel) oder als Bericht ausgeben möchte, hängt sich Access auf.
Ich habe meine Abfrage als SQL-Befehl angeschaut und sehe, dass hier sehr viele Verschachtelungen drin sind und natürlich sehr viele Tabellen angesprochen werden. Ich befürchte, dass Access deshalb wohl ein Performance-Problem hat... Nur: wie bringe ich das anders hin oder noch besser: wie verlagere ich die Rechenarbeit auf den Server? Oder muss ich das Ding von Grund auf anders angehen?

Das ist einer meiner Codes:

SELECT tbl_anmeldung.id, tbl_anreden.Name, tbl_person.Name, tbl_person.Vorname, tbl_person.Strasse, tbl_ort.PLZ, tbl_ort.Name, tbl_muttersprache.Name, tbl_deutscheinschaetzung.name, tbl_zivilstand.Name, tbl_einsatzplatz_1.Institution, tbl_einsatzplatz_2.Name, tbl_einsatzplatz.Name, tbl_anreden_1.Name, tbl_einsatzplatz.Vorname, tbl_einsatzplatz.Name, tbl_einsatzplatz.Adresse1, tbl_produkt_name.name, tbl_user.UserNameLong, tbl_user.UserNameShort, tbl_anmeldung.Stellenprozente, tbl_anmeldung.StellenprozenteDatenTeilnehmer, tbl_anmeldung.RahmenfristVon, tbl_anmeldung.RahmenfristBis, tbl_erfolgsbeschreibungmitvertrag.name, tbl_erfolgsbeschreibungohnevertrag.Name, tbl_loesungmitvertrag.Name, tbl_loesungohnevertrag.name, tbl_anmeldung.ref_Sozialdienst, tbl_anmeldung.ref_RAV, tbl_anmeldung.ref_Auftraggeber, tbl_adressen.Institution, tbl_anreden_2.Name, tbl_adressen.Name, tbl_adressen.Vorname, tbl_adressen.Strasse, tbl_ort_1.PLZ, tbl_ort_1.Name, tbl_adressen.TelG, tbl_adressen.TelGdirekt, tbl_adressen.emailG, tbl_anmeldung.KontaktEmail, tbl_anmeldung.KontaktTelefon, tbl_anmeldung.KontaktVorname, tbl_anmeldung.KontaktName, tbl_anreden_3.Name, tbl_anmeldung.Anmeldedatum, tbl_anmeldung.Bearbeitungsstatus, tbl_anmeldung.Vertragsbeginn, tbl_anmeldung.Vertragsende, tbl_anmeldung.ref_ALK, tbl_adressen_1.ALKNummer, tbl_adressen_1.Institution, tbl_person.PersonenNummer, tbl_person.AHVNr, tbl_person.Geburtsdatum, tbl_person.AnzahlKinder, tbl_person.JahrgangKinder, tbl_person.BerechnetesAlter, tbl_person.EMail, tbl_person.Natel, tbl_person.Telefon, tbl_person.Adresszusatz1, tbl_person.Adresszusatz2, intake2.aktuellerStand, intake2.Bemerkungen, intake2.Modul1, intake2.Modul2, intake.Intakestatus, intake.Modulstatus, intake2.StartdatumModul1, intake2.Modul1_regul_Enddatum, intake2.Modul1_effekt_Enddatum, intake2.Modul2_Startdatum, intake2.Modul2_regul_Enddatum, intake2.Modul2_effekt_Enddatum, intake2.Modul1_Stand_bei_Austritt, intake2.Modul2_Stand_bei_Austritt, intake2.Modul1_Anzahl_Tage, intake2.Modul2_Anzahl_Tage
FROM intake2 RIGHT JOIN (((((((((((((((((((((tbl_anreden INNER JOIN ((tbl_anmeldung LEFT JOIN tbl_produkt_name ON tbl_anmeldung.ref_ProduktBeiAnmeldung = tbl_produkt_name.id) INNER JOIN tbl_person ON tbl_anmeldung.ref_Person = tbl_person.id) ON tbl_anreden.id = tbl_person.ref_Anrede) LEFT JOIN tbl_muttersprache ON tbl_person.ref_Muttersprache = tbl_muttersprache.id) LEFT JOIN tbl_zivilstand ON tbl_person.ref_Zivilstand = tbl_zivilstand.id) INNER JOIN tbl_ort ON tbl_person.ref_PlzOrt = tbl_ort.id) LEFT JOIN tbl_nationalitaet ON tbl_person.ref_nationalitaet = tbl_nationalitaet.id) LEFT JOIN tbl_deutscheinschaetzung ON tbl_anmeldung.ref_Deutschkentnisse = tbl_deutscheinschaetzung.id) LEFT JOIN tbl_user ON tbl_anmeldung.ref_Mitarbeiter = tbl_user.id) LEFT JOIN tbl_einsatzplatz AS tbl_einsatzplatz_1 ON tbl_anmeldung.ref_ZugewiesenerEinsatzplatz = tbl_einsatzplatz_1.id) LEFT JOIN tbl_einsatzplatz AS tbl_einsatzplatz_2 ON tbl_anmeldung.ref_reservierterEinsatzplatz = tbl_einsatzplatz_2.id) LEFT JOIN tbl_einsatzplatz ON tbl_anmeldung.ref_ZugewiesenerEinsatzplatz_2 = tbl_einsatzplatz.id) LEFT JOIN tbl_anreden AS tbl_anreden_1 ON tbl_einsatzplatz.ref_Anrede = tbl_anreden_1.id) LEFT JOIN tbl_erfolgsbeschreibungmitvertrag ON tbl_anmeldung.ref_ErfolgsbeschreibungMitVertrag = tbl_erfolgsbeschreibungmitvertrag.id) LEFT JOIN tbl_erfolgsbeschreibungohnevertrag ON tbl_anmeldung.ref_ErfolgsbeschreibungOhneVertrag = tbl_erfolgsbeschreibungohnevertrag.id) LEFT JOIN tbl_loesungmitvertrag ON tbl_anmeldung.ref_LoesungMitVertrag = tbl_loesungmitvertrag.id) LEFT JOIN tbl_loesungohnevertrag ON tbl_anmeldung.ref_LoesungOhneVertrag = tbl_loesungohnevertrag.id) LEFT JOIN tbl_adressen ON tbl_anmeldung.ref_RAV = tbl_adressen.id) LEFT JOIN tbl_anreden AS tbl_anreden_2 ON tbl_adressen.ref_Anrede = tbl_anreden_2.id) LEFT JOIN tbl_ort AS tbl_ort_1 ON tbl_adressen.ref_PlzOrt = tbl_ort_1.id) LEFT JOIN tbl_anreden AS tbl_anreden_3 ON tbl_anmeldung.ref_KontaktAnrede = tbl_anreden_3.id) LEFT JOIN tbl_adressen AS tbl_adressen_1 ON tbl_anmeldung.ref_ALK = tbl_adressen_1.id) LEFT JOIN intake ON tbl_anmeldung.id = intake.ref_Anmeldung) ON intake2.ref_Anmeldung = tbl_anmeldung.id
WHERE (((tbl_produkt_name.id)=15 Or (tbl_produkt_name.id)=16 Or (tbl_produkt_name.id)=18 Or (tbl_produkt_name.id)=19 Or (tbl_produkt_name.id)=20));


Ich bin für jede Hilfe dankbar!

Gabriela

Mehrzweck

Ich habe soeben selbst die Lösung gefunden. Vielleicht interessiert es ja die wie ich weniger Versierten unter uns:

Ich habe zuerst die Abfrage mit den Serverdaten gemacht (also "lokal" resp. nicht auf dem SQL-Server liegende Daten erstmal in der Abfrage gelöscht) und dann diese zu einer "Pass-Through"-Abfrage umgemodelt. Im Eigenschaftenfenster musste ich den ODBC-String hinterlegen, sonst fragt Access bei jedem Ausführen immer wieder nach der ODBC-Verbindung. (Muss man auch zuerst drauf kommen...)
Danach habe ich aufbauend auf dieser Abfrage eine neue Abfrage gemacht, wo ich dann die "lokalen" Tabellen auch dabei habe (lokal sind die ja nicht, einfach nicht auf dem SQL-Server...) Uff! Aber es läuft, und zwar sehr schnell! Und wieder was gelernt dabei...  ;)

Viele Grüsse!
Gabriela