![]() |
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 |
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ß?
|
AW: SQl Abfrage sehr langsam
Meinst Du sinngemäß sowas?
SQL-Code:
(nur hingedaddelt, deshalb kann ich den einen oder anderen Schreib- bzw. Syntaxfehler nicht ausschließen)
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; |
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. |
AW: SQl Abfrage sehr langsam
Zitat:
|
AW: SQl Abfrage sehr langsam
Zitat:
|
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. |
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; |
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. |
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. |
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