PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Viele Abfragen zusammenfassen möglich?



Hobbes
26-06-2008, 17:02
Hi allerseits,

ich habe in meinem Programm viele kleine Datenbankabfragen und würde gerne wissen, ob ich die zu einer Abfrage zusammenfassen kann. Zugrunde liegt eine DBF-Datenbankdatei, die in Java über einen JDBC-Treiber angesprochen wird *grusel*

Die Tabelle, um die es geht, hat die Spalten Datum (PrimaryKey,Date), Gruppennr (NUMBER), Partner (STRING), AufgabeErfüllt (BOOLEAN), WarAnwesend (BOOLEAN)

Der Schlüssel ist die Datumsspalte. Für jeden Tag existiert ein Eintrag.

Nun brauche ich mehrere Informationen aus der Tabelle, z.B. wie oft die Person in einem gewählten Zeitraum anwesend war (nach Jahren gruppiert). Für jede Zeile dieses Ergebnisses brauche ich jeweils noch die Gruppennr an einem bestimmten Datum, der Partner an einem anderen Datum und ob an einem dritten Datum die Aufgabe erfüllt wurde.

Das ergibt die Abfragen

SELECT YEAR(Datum) Jahr, SUM(IF(WarAnwesend=true,1,0)) Anwesenheitstage
FROM Tabelle WHERE Datum BETWEEN '2007-11-01' AND '2008-03-20'
GROUP BY YEAR(Datum)

Für die erste Zeile des Resultsets

SELECT Gruppennr FROM Tabelle WHERE Datum='2007-12-01'
SELECT Partner FROM Tabelle WHERE Datum='2007-11-13'
SELECT AufgabeErfüllt FROM Tabelle WHERE Datum='2007-12-20'

Für die zweite Zeile des Resultsets sind dann nochmal diese Abfragen (mit anderen Daten) nötig.

Da diese Abfragen sehr häufig notwendig sind, würde ich gerne möglichst wenig Datenbankzugriffe haben. Ist das möglich?

jan61
26-06-2008, 23:32
Moin,


*grusel*

Ja, ich auch ;-) So auf den 1. Blick würde ich mal sagen: grottenhaft schlechtes DB-Design (wobei ich mich mit DBF nicht auskenne - ist das überhaupt ein relationales System? - ist das nicht dieses komische DBASE - Die Beständigste Aller Schlimmen Erfahrungen?).

Das Problem ist, dass - zumindest für mich als unbeteiligten Betrachter - überhaupt kein Zusammenhang zwischen dem Hauptselect und den nachfolgenden Teilselects besteht. Und nebenbei verstehe ich den sachlichen Hintergrund nicht. Wie soll man da optimieren?

Die einzige Möglichkeit, die mir einfällt (keine Ahnung, ob diese "Datenbank" das unterstützt und ob das was bringt):

SELECT YEAR(Datum) Jahr,..., (SELECT Gruppennr FROM Tabelle WHERE Datum='2007-12-01') Gruppe, ... FROM ... also die Teilabfragen als Spalten in die Hauptabfrage aufnehmen. Richtige DBMS können das - Voraussetzung ist, dass die Subselects immer genau einen Satz zurückliefern (nach Deiner Beschreibung aber zutreffend).

Jan

Hobbes
27-06-2008, 18:33
Hi Jan,

beim Datenbankdesign gebe ich dir grundsätzlich recht. Es ist nicht optimal. Aber daran kann ich nichts ändern.

Mein Beispiel oben war stark vereinfacht. Bei mir sind die Spalten/Inhalte anders. Fakt ist, dass diese Tabelle eine Sammelstelle für (redundante) Informationen ist, deren Berechnung sehr aufwändig und von vielen Parametern abhängig ist. Insofern ist es letztendlich nachvollziehbar, warum man sich für diesen Weg entschieden hat.

Dein Vorschlag scheint mir brauchbar. Der funktioniert soweit auch. Dann kann ich das zumindest für jedes Jahr zusammenfassen. Wobei aber vermutlich trotzdem für jedes SELECT ein neuer Datenbankzugriff gemacht wird?!? Ich könnte mir vermutlich nur dadurch Rechenzeit sparen, weil alles in einem einzigen ResultSet zurückgegeben wird?!?

Und ja, DBF kommt von DBASE. An relationale Datenbanken ist dabei nicht zu denken. Dafür kann man die DBF-Dateien "wunderbar" von Hand mit einem Texteditor bearbeiten *lol*

jan61
27-06-2008, 19:39
Moin,


...Wobei aber vermutlich trotzdem für jedes SELECT ein neuer Datenbankzugriff gemacht wird?!? Ich könnte mir vermutlich nur dadurch Rechenzeit sparen, weil alles in einem einzigen ResultSet zurückgegeben wird?!?

Das kann man ohne Blick hinter die Kulissen des Treibers nicht sagen. In einem "richtigen" DBMS übernimmt der Optimizer des Servers die Angelegenheit und sorgt (meist) dafür, das die Geschichte so optimal wie möglich abläuft. Wie oft und in welcher Form in Dbase auf die Dateien zugegriffen wird, ob das im Speicher oder auf Platte abläuft, wie optimiert wird - keine Ahnung. Läuft da überhaupt irgendein Serverprozess oder simuliert der Treiber nur DB-Abfragen über eine File-Schnittstelle?

Jan

Hobbes
27-06-2008, 20:18
Hi Jan,

da bin ich auch überfragt. Ich bin jedenfalls froh, dass es überhaupt einen Treiber gibt, mit dem ich die üblichen SQL-Kommandos nutzen kann :)