Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL optimimieren notwendig Max() (https://www.delphipraxis.net/209747-sql-optimimieren-notwendig-max.html)

Dumpfbacke 20. Jan 2022 17:34

AW: SQL optimimieren notwendig Max()
 
Zitat:

Zitat von Jasocul (Beitrag 1500812)
Folgender Vorschlag:
Code:
Select Max(Feld1)
from (select Feld1, Feld3
      from (Select Feld1, Feld2, Feld3
            from tabelle1
            where Feld2 = 'Schraube')
      where Feld3 <> 'klein' and Feld 3 <> '')
Das sollte dazu führen, dass im tiefsten Sub-Select der Index von Feld2 gezogen wird.
Dieser liefert nur 29 Datensätze.
Das Sub-Select in der darüber liegenden Ebene macht ein Full Table Scan über die 29 Datensätze. Dies darf nur ein paar ms dauern.
Selbst wenn dann immer noch 29 Datensätze übrig wären, kann das Max(Feld1) auf oberster Ebene ebenfalls nur ms dauern.

Sollte die gesamte Abfrage immer noch 6 Sekunden benötigen, ist entweder der Index für Feld2 nicht in Ordnung oder es liegt mMn nach eher ein technisches oder DB-Konfigurations Problem vor.

Es ist wie verhext hier. Es geht auch nicht. Bei mir muss doch dann irgendetwas nicht in Ordnung sei. Es kommt erneut zu den 6 Sekunden. Das ganze wundert micht so langsamm.

Prepare time = 0ms
Execute time = 6s 657ms
Avg fetch time = 6.657,00 ms
Current memory = 18.323.720
Max memory = 147.452.584
Memory buffers = 2.048
Reads from disk to cache = 90.199
Writes from cache to disk = 0
Fetches from cache = 90.277

himitsu 20. Jan 2022 19:23

AW: SQL optimimieren notwendig Max()
 
In einem "normalen" Index steht drin , was es zu wechem Datensatz gibt.
Du suchst aber nach "nicht da".
> ich suche ABC und bekomme als Ergebnis alle Datensatzzeiger direkt aus dem einen Index-Eintrag
> im Index steht aber keine Liste aller nichtzutreffenden Datensätze

Klar könnte man denken, dass man nun einfach danach sucht und wenn mein Datensatz nicht im Ergebnis vorkommt, dann nehme ich den, aber dafür muß man ja dennoch erstmal alles durchsuchen ... da denkt sich die Datenbbank wohl: Wenn ich sowieso alles laden muß, dann ignoriere ich einfach den Index.

In vielen DBMS gibt es verschiedene Arten von Indize.
Eventuell funktioniert es mit einer anderen Art besser?

Oder einfach selber Mal versuchen umzudrehen und der DB ein "suche nach" unterjubeln?
Also in einem JOIN/SubSELECT nach
SQL-Code:
WHERE kennung IN ('klein', ' ')
suchen und dann via
SQL-Code:
IS NOT NULL
oder
SQL-Code:
NOT Exists(...)
mit dem eigentlichen SELECT verknubbeln.

Jasocul 21. Jan 2022 06:35

AW: SQL optimimieren notwendig Max()
 
Dann mal ein anderer Ansatz (Abfrage ist ungeprüft eingetippt):
Code:
with q1 as
     (Select Feld1, Feld2, Feld3
      from tabelle1
      where Feld2 = 'Schraube'),

     q2 as
     (select Feld1, Feld3
      from q1
      where Feld3 <> 'klein' and Feld 3 <> '')

Select Max(Feld1)
from q2
Damit sollte die DB keine Möglichkeit mehr haben, den Index der ersten Abfrage zu umgehen. Der Rest ist dann aber ein Full-Table-Scan auf das Ergebnis der ersten Abfrage. Bei 29 Datensätzen sollte das aber kein Problem sein.
Du kannst natürlich mal die erste Abfrage separat ausführen, ob die auch wirklich schnell ist. Wenn die schon ein paar Sekunden braucht, liegt das Problem woanders.

Frickler 24. Jan 2022 12:25

AW: SQL optimimieren notwendig Max()
 
Was ist, wenn Du einen zusätzlichen berechneten Index anlegst:
Code:
CREATE INDEX feld3nichtleer ON Tabelle1 COMPUTED BY (Feld3<>'')


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:46 Uhr.
Seite 4 von 4   « Erste     234   

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