Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQl Abfrage sehr langsam (https://www.delphipraxis.net/215368-sql-abfrage-sehr-langsam.html)

tkhandel 21. Jun 2024 10:23

Datenbank: Interbase • Version: 2020 • Zugriff über: FD

SQl Abfrage sehr langsam
 
Hallo
ich habe eine SQL-Abfrage die im Client ausgeführt wird, und sehr langsam ist.
Wahrscheinlich wäre ja eine Storedprocedure viel schneller ich kriege es aber
einfach nicht hin.

Hat jemand einen TIP wie ich diese Abfrage, die mehrere Summen verschiedener Spalten
aus einer Tabelle abfragen soll, verbessern könnte:

Select
FahrerNr, b.Name,

(Select Sum(VKBG)
from Tagesumsatz x
where x.FahrerNr = TU.FahrerNr
and cast(Datum as Date) = :EingabeDatum) as Umsatz,

(Select Sum(VKBG)
from Tagesumsatz x
where x.FahrerNr = TU.FahrerNr
and cast(Datum as Date) = :EingabeDatum and Zahlart = 1) as Bar,

(Select Sum(VKBG)
from Tagesumsatz x
where x.FahrerNr = TU.FahrerNr
and cast(Datum as Date) = :EingabeDatum and Zahlart = 3) as Karte,

(Select Sum(VKBG)
from Tagesumsatz x
where x.FahrerNr = TU.FahrerNr
and cast(Datum as Date) = :EingabeDatum and Zahlart = 2) as LS

from Tagesumsatz TU left join Fahrer b on b.Nr = tu.FahrerNr

Group by FahrerNr, Name

gubbe 21. Jun 2024 10:41

AW: SQl Abfrage sehr langsam
 
Als erstes würde ich mir anschauen, ob auf die relevanten Spalten aus dem Join und den Where-Bedingungen ein index gesetzt ist. Ist das der Fall oder hast Du darauf einen Einfluß?

Delphi.Narium 21. Jun 2024 11:14

AW: SQl Abfrage sehr langsam
 
Meinst Du sinngemäß sowas?
SQL-Code:
select -- Zuletzt die Summen je FahrerNr bilden
  FahrerNr,
  b.Name,
  Sum(Umsatz) as Umsatz,
  Sum(Bar) as Bar,
  Sum(Karte) as Karte,
  Sum(LS) as LS
from (
  select -- FahrerNr, Name und Umsatz nach Zahlart separieren
    FahrerNr,
    b.Name,
    VKBG as Umsatz,
    case when Zahlart = 1 then VKBG else 0 end as Bar,
    case when Zahlart = 3 then VKBG else 0 end as Karte,
    case when Zahlart = 2 then VKBG else 0 end as LS
  from (
    select -- uns interessieren nur die Daten zum EingabeDatum
      FahrerNr,
      VKBG
    from Tagesumsatz
    where cast(Datum as Date) = :EingabeDatum
  ) TU
  -- nur die Fahrerdaten zum EingabeDatum dazu holen,
  -- anstatt zuerst alle Fahrerdaten zu beliebigem Datum zusammensuchen
  -- und dann erst die zum EingabeDatum zu separieren.
  left join Fahrer b on b.Nr = tu.FahrerNr
) a
Group by
  FahrerNr,
  Name;
(nur hingedaddelt, deshalb kann ich den einen oder anderen Schreib- bzw. Syntaxfehler nicht ausschließen)

Papaschlumpf73 21. Jun 2024 12:35

AW: SQl Abfrage sehr langsam
 
Und die folgende Zeile würde ich genau andersrum machen:

where cast(Datum as Date) = :EingabeDatum

Also nicht (für Mio. Datensätze) das Feld "Datum" in einen anderen Datentyp casten, sondern den Parameter :EingabeDatum einmal in den Datentyp vom Feld "Datum" casten.

Jasocul 21. Jun 2024 14:42

AW: SQl Abfrage sehr langsam
 
Zitat:

Zitat von Papaschlumpf73 (Beitrag 1538083)
Und die folgende Zeile würde ich genau andersrum machen:

where cast(Datum as Date) = :EingabeDatum

Also nicht (für Mio. Datensätze) das Feld "Datum" in einen anderen Datentyp casten, sondern den Parameter :EingabeDatum einmal in den Datentyp vom Feld "Datum" casten.

Vor allem wenn auf dem Datumsfeld ein Index ist, wird dieser durch das Cast sehr wahrscheinlich ingoriert. Kein Index = langsam

Uwe Raabe 21. Jun 2024 14:59

AW: SQl Abfrage sehr langsam
 
Zitat:

Zitat von Papaschlumpf73 (Beitrag 1538083)
Und die folgende Zeile würde ich genau andersrum machen:

where cast(Datum as Date) = :EingabeDatum

Also nicht (für Mio. Datensätze) das Feld "Datum" in einen anderen Datentyp casten, sondern den Parameter :EingabeDatum einmal in den Datentyp vom Feld "Datum" casten.

Das muss nicht unbedingt funktionieren, z.B. wenn das Feld einen Time-Anteil hat, der beim CAST(Datum as DATE) auf 0 gesetzt wird.

Delphi.Narium 21. Jun 2024 15:22

AW: SQl Abfrage sehr langsam
 
Und wenn man's so macht? Hat man 'nen Cast des Datum auf den DATE-Typen, mit ggfls. abgeschnittenem Zeitanteil und darauf auch 'nen Index.

SQL-Code:
create index IX_Cast_DATUM on Tagesumsatz computed by (cast(DATUM as DATE))


Vielleicht immer noch nicht optimal, aber schonmal nicht indexlos.

oder
SQL-Code:
where datum >= Cast(:Eingabedatum as Date) and datum < Cast(:Eingabedatum + 1 as Date)


Naja, solange wir nicht wissen, welchen Datentyp die Spalte DATUM in der Tabelle Tagesumsatz hat, ist das halt alles Spekulation. Und wenn wir dann noch wüssten um welche Datenmengen es sich handelt, könnten die Vorschläge deutlich zielgerichteter erfolgen.

Jumpy 24. Jun 2024 08:04

AW: SQl Abfrage sehr langsam
 
Keine Ahnung, ob es das besser macht, aber man kann Delphi.Nariums abfrage noch einkürzen:

SQL-Code:
select
    t.FahrerNr,
    b.Name,
    Sum(VKBG) as Umsatz,
    Sum(case when Zahlart = 1 then VKBG else 0 end) as Bar,
    Sum(case when Zahlart = 3 then VKBG else 0 end) as Karte,
    Sum(case when Zahlart = 2 then VKBG else 0 end) as LS
From Tagesumsatz t
Left join Fahrer b on b.Nr = tu.FahrerNr
Where cast(Datum as Date) = :EingabeDatum
Group by
  FahrerNr, Name;

tkhandel 24. Jun 2024 14:33

AW: SQl Abfrage sehr langsam
 
Danke für die vielen Antworten,
werde es heute Abend mal probieren.
die Spalte Datum ist tatsächlich DateTime Feld.

joachimd 25. Jun 2024 10:28

AW: SQl Abfrage sehr langsam
 
wenn DateTime, dann wird über cast(datum as date) die Optimierung umgangen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz