Thema: SQL Nachhilfe

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: SQL Nachhilfe

  Alt 27. Jan 2024, 09:11
Jupp, ein JOIN, anstatt des SubSELECTs.
Und dann auch schauen, ob auf den verlinkten Feldern ein Index liegt.

SQL-Code:
SELECT s.ArtNr, s.ArtName1,s.ArtGruppe, s.ArtZusInfo4
FROM sArtikel AS s
LEFT JOIN ArtLief AS l
   ON l.ArtLiefArtNr = s.ArtNr
  AND l.ArtLiefLiefNr = s.ArtZusInfo4
WHERE s.ArtInaktiv = false
  AND s.ArtZusInfo4 LIKE 'K*'
  AND l.irgendwas IS NULL -- hier irgendein NOT NULL Keyfield, vielleicht l.ArtLiefArtNr
INDIZE auf:
l) ArtLiefLiefNr, ArtLiefArtNr (hier dachte ich erst es wäre zwei mal das gleiche, aber einfach das = umgedreht und schon fällt es sofort auf)
s) ArtInaktiv, ArtZusInfo4, ArtNr

Und bezüglich des LIKE, k.A. wie es bei Access aussieht, aber z.B. in MySQL gibt es verschiedene Indize, wobei Manche für sowas wie LIKE nicht geeignet sind.
Zum Glück ist auch der * am Ende, denn die meisten Indize sind für Suchen, wo * am Anfang oder mittendrin wäre, ebenfalls ungeeignet.

Gut, das System könnte natürlich auch intelligenter sein und erkennen, dass das Subselect als JOIN besser geeignet ist und es das entsprechend selbstständig umstellt.
* anstatt für jede Zeile eine einzelne Abfrage auszufühen
* die Tabelle nur einmal lagen und jeweils nur schnell darin zu suchen

Wenn die Optimierung im DSMS nichts kann, sie also nicht erkennen würde, dass dein Subsselekt langsam ist und es scheller wäre die folgenden AND vorzuziehen,
dann würde das Subselect für JEDEN Datensatz ausgewertet, anstatt nur für einen Teil, nach der Filterung durch die beiden = , also
SQL-Code:
WHERE s.ArtInaktiv = false
  AND s.ArtZusInfo4 like 'K*'
  AMD NOT EXISTS (SELECT *
                    FROM ArtLief l
                    WHERE s.ArtNr = l.ArtLiefArtNr
                    and l.ArtLiefLiefNr = s.ArtZusInfo4
                 )
Drum kommt bei mir gedanklich auch das IS NULL "gedanklich" als letztes im WHERE vor ,
wobei ein NULL-Prüfung in einem INDEX wohl auch wiederum optimaler/schneller sein dürfte, als ein = oder LIKE.


PS: In vielen DBMS gibt SQL-Befehle oder Zusatztools, um das Statement analysieren zu lassen.
Was wird wo gemacht (z.B. FullTableScann anstatt IndexScan) und vielleicht auch vie viel Zeit welcher Teil braucht.

sowas hab ich jetzt noch nicht gesehn,
https://www.postgresql.org/docs/curr...l-analyze.html
https://docs.oracle.com/en/database/...F-DCB3772C1B0E
aber
https://support.microsoft.com/en-us/...b-30b86082d792
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (27. Jan 2024 um 09:28 Uhr)
  Mit Zitat antworten Zitat