AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQl Abfrage sehr langsam
Thema durchsuchen
Ansicht
Themen-Optionen

SQl Abfrage sehr langsam

Ein Thema von tkhandel · begonnen am 21. Jun 2024 · letzter Beitrag vom 27. Jun 2024
Antwort Antwort
Seite 1 von 2  1 2      
Delphi.Narium

Registriert seit: 27. Nov 2017
2.582 Beiträge
 
Delphi 7 Professional
 
#1

AW: SQl Abfrage sehr langsam

  Alt 21. Jun 2024, 10:14
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)
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
464 Beiträge
 
Delphi 12 Athens
 
#2

AW: SQl Abfrage sehr langsam

  Alt 21. Jun 2024, 11:35
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.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.374 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: SQl Abfrage sehr langsam

  Alt 21. Jun 2024, 13:42
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
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.742 Beiträge
 
Delphi 12 Athens
 
#4

AW: SQl Abfrage sehr langsam

  Alt 21. Jun 2024, 13:59
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.582 Beiträge
 
Delphi 7 Professional
 
#5

AW: SQl Abfrage sehr langsam

  Alt 21. Jun 2024, 14:22
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.

create index IX_Cast_DATUM on Tagesumsatz computed by (cast(DATUM as DATE))

Vielleicht immer noch nicht optimal, aber schonmal nicht indexlos.

oder 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.

Geändert von Delphi.Narium (21. Jun 2024 um 20:35 Uhr) Grund: Schreibfehler
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: SQl Abfrage sehr langsam

  Alt 24. Jun 2024, 07:04
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;
Ralph
  Mit Zitat antworten Zitat
tkhandel

Registriert seit: 2. Jan 2022
Ort: Arnsberg im Sauerland
107 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: SQl Abfrage sehr langsam

  Alt 24. Jun 2024, 13:33
Danke für die vielen Antworten,
werde es heute Abend mal probieren.
die Spalte Datum ist tatsächlich DateTime Feld.
Jürgen
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
685 Beiträge
 
Delphi 12 Athens
 
#8

AW: SQl Abfrage sehr langsam

  Alt 25. Jun 2024, 09:28
wenn DateTime, dann wird über cast(datum as date) die Optimierung umgangen.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.582 Beiträge
 
Delphi 7 Professional
 
#9

AW: SQl Abfrage sehr langsam

  Alt 25. Jun 2024, 10:03
Wenn DateTime, aber (beide Seiten) ohne Zeitanteil, kann man sich Cast as Date sparen.

Wenn mit Zeitanteil und :EingabeDatum ohne Zeitanteil dann eher sowas: where Datum between :von and :bis
:von wird im Programm mit sowas wie Trunc(Now) und :bis mit Trunc(Now + 1) - 1 / 86400000 (= eine Millisekunde) gefüllt, das ergibt dann sinngemäß sowas wie where Datum between 25.06.2024 00:00:00.000 and 25.06.2024 23:59:59.999
Dann dürfte der Index auch genutzt werden können.

Geht es nur um das Datum ohne Zeitanteil sollte where datum >= Cast(:Eingabedatum as Date) and datum < Cast(:Eingabedatum + 1 as Date) funktionieren. Wenn :Eingabedatum ohne Zeitanteil geliefert wird, verkürzt sich das dann auf where datum >= :Eingabedatum and datum < :Eingabedatum + 1

Der Flaschenhals im Ausgangs-SQL dürfte aber die spaltenweisen Summierungen per Sub-Select sein. Hier muss die Datenbank eine sehr große Menge von Abfragen starten, je Ergebniszeile vier Stück und die jeweils ohne 'nen Index verwenden zu können.
  Mit Zitat antworten Zitat
tkhandel

Registriert seit: 2. Jan 2022
Ort: Arnsberg im Sauerland
107 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: SQl Abfrage sehr langsam

  Alt 25. Jun 2024, 17:27
Ich habe mal alles probiert aber es kommt immer der gleiche Fehler
den ich nicht lokalisieren kann

select
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 = t.FahrerNr
where datum >= :Eingabedatum and datum < :Eingabedatum + 1
Group by FahrerNr, Name;


Unsuccessful execution caused by a system error that precludes
successful execution of subsequent statements.
Dynamic SQL Error.
expression evaluation not supported.
--------------------------------------------------------------
SQLCODE: -902
GDSCODE: 335544569
Jürgen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:57 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-2025 by Thomas Breitkreuz