Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL Nachhilfe (https://www.delphipraxis.net/214547-sql-nachhilfe.html)

hoika 31. Jan 2024 18:57

AW: SQL Nachhilfe
 
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.

himitsu 31. Jan 2024 19:12

AW: SQL Nachhilfe
 
Das
Delphi-Quellcode:
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.

hoika 31. Jan 2024 21:17

AW: SQL Nachhilfe
 
Hallo,
kein Index?

CREATE INDEX idx_ABFDok_ABFPosArtNr_Datum_Type_KundenNr ON ABFDok (ABFPosArtNr, ABFDocDatum, ABFDocType, ABFDocKundenNr);


Eventuell sollte noch ein Index direkt auf ABFDocDatum gesetzt werden, also nicht so ein "komischer" Compound-Index.

himitsu 1. Feb 2024 12:16

AW: SQL Nachhilfe
 
idx_ABFDok_ABFPosArtNr_Datum_Type_KundenNr ist ein Combi-Index, der genutzt wird, wenn im WHERE direkt auf alle Felder (ABFPosArtNr, ABFDocDatum, ABFDocType, ABFDocKundenNr) gerpft wird.

Hast du einen Index nur auf "ABFDocDatum", also
Delphi-Quellcode:
CREATE INDEX idx_ABFDocDatum ON ABFDok (ABFDocDatum);
(oder z.B.
Delphi-Quellcode:
ABFDocDatum UNIQUE
im CREATE TABLE), dann
* wird bei
Delphi-Quellcode:
WHERE ABFDocDatum ...
dieser Index benutzt
* aber nicht bei
Delphi-Quellcode:
WHERE Year(ABFDocDatum) ...


Für Letzteres bräuchte man z.B. sowas
Delphi-Quellcode:
CREATE INDEX idx_YearABFDocDatum ON ABFDok (Year(ABFDocDatum));
(falls Access sowas kann)



Und wie gesagt, kommt es teilweise auch auch auf die Art des Indize drauf an.
MySQL oder z.B. Postgres kennen unterschiedliche Typen (z.B. B-tree, hash, GiST, SP-GiST, GIN, and BRIN)

B-Tree ist heute oft gebräuchlich und auch für ein
Delphi-Quellcode:
LIKE 'irgendwas*'
geeignet, während HASH für ein LIKE absolut unnütz ist, aber für ein
Delphi-Quellcode:
=
mit langen Strings super wäre.
Und für
Delphi-Quellcode:
LIKE '*sonstwas'
wäre es besser, wenn der B-Tree rückwärts von hinten aufgebaut ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:41 Uhr.
Seite 2 von 2     12   

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