Einzelnen Beitrag anzeigen

Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#1

Select über 2 Tables dauert mehere Minuten

  Alt 30. Mai 2006, 12:30
Datenbank: Firebird • Version: WI-V1.0.2.908 • Zugriff über: BDE
Hi Leute,

ich bin gerade am verzweifeln, ich habe eine Datenbank die im Moment ca. 20 MB gross ist, jeden Tag wächst diese DB um ca. 2 -4 MB(es handelt sich um Bewegungsdaten aus einer Kasse, wie Ihr sie aus vielen Cafes kennt).

Auf Basis dieser Daten möchte ich diverse Auswertungen machen.
Aber erstmal die Table Struktur :

Delphi-Quellcode:
CREATE TABLE "TRANSAKTION"
(
  "SORT_ID"  INTEGER NOT NULL,
  "IMPORT_ID"  INTEGER NOT NULL,
  "ID"  INTEGER NOT NULL,
  "JOURNAL_NR"  INTEGER,
  "START_DT"  DOUBLE PRECISION,
  "ENDE_DT"  DOUBLE PRECISION,
  "KASSEN_NR"  INTEGER,
  "TISCH_NR"  INTEGER,
  "BEDIENER_START"  INTEGER,
  "BEDIENER_ENDE"  INTEGER,
  "BON_NR"  INTEGER,
  "BON_TYP"  INTEGER,
  "TOTAL"  DOUBLE PRECISION,
  "TOTAL_TYP"  VARCHAR(10),
  "TOTAL_NETTO"  DOUBLE PRECISION,
  "FINANZWEG"  INTEGER,
  "ZAHLGELD"  DOUBLE PRECISION,
  "AUSLAGEN"  DOUBLE PRECISION,
  "INFOREC_TYPE"  INTEGER,
  "INFOREC_VALUE"  INTEGER,
  "EXPORT_DT"  DOUBLE PRECISION,
CONSTRAINT "RDB$PRIMARY7" PRIMARY KEY ("SORT_ID", "IMPORT_ID", "ID")
);

CREATE TABLE "TRANSAKTIONDETAILS"
(
  "SORT_ID"  INTEGER NOT NULL,
  "TRANSAKTION_ID"  INTEGER NOT NULL,
  "ID"  INTEGER NOT NULL,
  "PARENT_JOURNALNR"  INTEGER,
  "JOURNALNR"  INTEGER,
  "GEBUCHT_DT"  DOUBLE PRECISION,
  "ABGERECHNET_DT"  DOUBLE PRECISION,
  "ARTIKEL_NR"  INTEGER,
  "ANZAHL"  INTEGER,
  "PREIS"  DOUBLE PRECISION,
  "ILEVEL"  INTEGER,
  "MODIFYER"  INTEGER,
  "SOFORTSTORNO"  DOUBLE PRECISION,
  "RUECKNAHME"  SMALLINT,
  "STORNO"  SMALLINT,
  "MOD_NR"  INTEGER,
  "MOD_TYPE"  INTEGER,
  "MOD_FACTOR"  INTEGER,
  "ISTAUSLAGE"  SMALLINT,
CONSTRAINT "RDB$PRIMARY8" PRIMARY KEY ("SORT_ID", "TRANSAKTION_ID", "ID")
Der Table TransaktionDetails enthält wirklich jeden Schei**, jede Cola jeden Cafe alles was ein Kellner verkauft, storniert und gemacht haben.

Eine SQL Abfrage die den Vogel wirklich abschiesst(dauerd 15-20 Minuten und der Process IBserver zieht sich alles an CPU was er bekommen kann) :

Delphi-Quellcode:
SELECT ARTIKEL_NR, Sum(ANZAHL) AS ANZ, Sum(PREIS * ANZAHL) as GPreis
FROM TRANSAKTION T INNER JOIN TRANSAKTIONDETAILS TD ON(T.ID = TD.TRANSAKTION_ID)
WHERE T.ENDE_DT >= 38864.25 And T.ENDE_DT < 38865.25
And (T.BON_TYP=1 Or T.BON_TYP=2) And ARTIKEL_NR IN('+strL_KuechenArtikel.commatext+')'+
T.SORT_ID = 6 GROUP BY ARTIKEL_NR;
Wie Ihr im SQL seht arbeite ich mit ARTIKEL_NR IN, dort kommen ca. 200-300 Artikel-Nummern die zur Warengruppe Küche gehören. In diesem Fall will ich den Umsatz der Küche ermitteln.
Ich habe das ganze auch schon ohne IN versucht hat aber keinen Effekt die Query dauerd immer Ewig.

In dem Table Transaktion sind insgesamt 34232 Datensätze und 2931 Datensätze die in den Zeitraum passen.

In dem Table TransaktionDetails sind insgesamt 97758 Datensätze.

Hat jemand ne Ahnung warum das Select So lange dauerd und wie manche das ganze beschleunigen könnte ?

Vorher hatte ich das ganze zum Testen auf der Basis von Access und die Abfragen waren wesentlich schneller(ein paar Sekunden).

Danke und Gruß Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat