AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Nachhilfe

Ein Thema von HCB · begonnen am 27. Jan 2024 · letzter Beitrag vom 1. Feb 2024
Antwort Antwort
HCB

Registriert seit: 12. Feb 2020
218 Beiträge
 
Delphi 12 Athens
 
#1

AW: SQL Nachhilfe

  Alt 31. Jan 2024, 14:22
Da ist mir doch noch einer auffällig langsam:
Delphi-Quellcode:
SELECT
A.ABFDocErfNr,A.ABFDocDatum,A.ABFDocKundenNr, A.ABFDocKundekurzbez,
P.ABFPosArtNr,P.ABFPosName1,P.ABFPosEPreis,
M.PersKtoPreisGruppe
FROM (ABFDok as A
INNER JOIN ABFPos as P ON A.ABFDocId = P.ABFPosDocID )
inner join sPersKto as M on M.PersKtoNummer = A.ABFDocKundenNr
where P.ABFPosArtNr = '11024060and Year([A.ABFDocDatum]) > Year(Date())-5 and A.ABFDocType = 1
ORDER BY A.ABFDocId desc;
Diesesmal scheint mir (als Dilli) das etwas komplizierter wegen den 2 inner joints.
Könnte nochmals Hilfe gebrauchen um die Query flinker zu machen.

LG Harry
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

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

AW: SQL Nachhilfe

  Alt 31. Jan 2024, 15:02
... inner joints.
Harry, YMMD

Was mir sofort auffällt:
Durch
Code:
Year([A.ABFDocDatum]) > Year(Date())-5
kann für "ABFDocDatum" schonmal kein Index mehr gezogen werden.
Dann teste bitte zusätzlich noch, ob es ohne
Code:
order by
spürbar schneller ist.

Leider kann ich heute nicht mehr weiterhelfen, da ich gleich auf einer Demo bin.
Peter
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
333 Beiträge
 
Delphi 12 Athens
 
#3

AW: SQL Nachhilfe

  Alt 31. Jan 2024, 15:29
Ich würd jetzt einfach mal das probieren:

Code:
-- Index für ABFPos
CREATE INDEX idx_ABFPos_ABFPosDocID ON ABFPos (ABFPosDocID);

-- Index für sPersKto
CREATE INDEX idx_sPersKto_PersKtoNummer ON sPersKto (PersKtoNummer);

-- Index für ABFDok
CREATE INDEX idx_ABFDok_ABFPosArtNr_Datum_Type_KundenNr ON ABFDok (ABFPosArtNr, ABFDocDatum, ABFDocType, ABFDocKundenNr);
  Mit Zitat antworten Zitat
HCB

Registriert seit: 12. Feb 2020
218 Beiträge
 
Delphi 12 Athens
 
#4

AW: SQL Nachhilfe

  Alt 31. Jan 2024, 17:29
Hallo,
mit den indexen wurde es keider auch nicht schneller.

LG Harry
  Mit Zitat antworten Zitat
Jumpy

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

AW: SQL Nachhilfe

  Alt 31. Jan 2024, 17:40
Year([A.ABFDocDatum]) > Year(Date())-5

Könnte man vllt. umformulieren zu

[A.ABFDocDatum] >= DateSerial(Year(Date())-4, 1, 1 )
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.361 Beiträge
 
Delphi 12 Athens
 
#6

AW: SQL Nachhilfe

  Alt 31. Jan 2024, 18:32
Jupp, da hier das Feld durch eine Funktion geht, kann nicht der Index genutzt werden, welcher auf diesem Feld liegt.

Also direkt das Feld direkt verwenden, damit der Index genutzt werden kann, wäre somit eine Lösung (siehe Jumpy)



Oder einen Index auf das Jahr erstellen, also auf Year([A.ABFDocDatum]) .

Weiß aber nicht, ob es sowas auch im Access gibt.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (31. Jan 2024 um 18:38 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: SQL Nachhilfe

  Alt 31. Jan 2024, 18:57
Hallo,
das Year-Dingens könnte man so umschreiben

DateAdd("yyyy", -5, Date())

Aber warum übergibst Du das nicht als konstanten Parameter?
Warum wird das jedesmal berechnet?

Und noch mal auf die Indizes zu kommen.
INNER JOIN ABFPos as P ON A.ABFDocId = P.ABFPosDocID )
inner join sPersKto as M on M.PersKtoNummer = A.ABFDocKundenNr
where P.ABFPosArtNr = '11024060' and Year([A.ABFDocDatum]) > Year(Date())-5 and A.ABFDocType = 1


Die fett markierten Felder müssten Indizes enthalten.

Ich würde danach auch mal die MDB komprimieren.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.361 Beiträge
 
Delphi 12 Athens
 
#8

AW: SQL Nachhilfe

  Alt 31. Jan 2024, 19:12
Das DateAdd("yyyy", -5, Date()) wird nur einmal berechnet. (außer die haben bei der Funktion und dem Queryplaner echt Scheiße gebaut)

Aber das Date vom Feld, wird natürlich für jeden Datensatz berechnet.
Ja, die Berechnung/Funktionsausführung dauert nicht lange und braucht nahezu keine Zeit,
aber da es keinen Index auf dessen Ergebnis gibt, kann eben auch Keiner genutzt werden.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:01 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