Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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 17. Jan 2022 09:51

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBExpert

SQL optimimieren notwendig Max()
 
Hallo Ihr Experten,
ich haben da mal eine Frage ob man hier bei einen SQL Befehlt noch etwas optimieren kann. Ich möchte das größte Datum aus einer Tabelle haben bei der gewisse Bedingungen erfüllt sind.

Delphi-Quellcode:
Select Max(Feld1) From tabelle1 where Feld2 = 'Schraube' and Feld3 <> 'klein' and Feld 3 <> ''
Auf allen Feldern (Feld 1 - 3) liegt hier ein kombi Index drauf. Das zeites habe ich auhc nich einen als Absteigend angelegt.

Das ganze dauter 6 Sekunden wenn ich nun das Max(Feld1) für ein * ersetze kommt als Ergebis hier 3 zelen raus.

Das schöne ist as es jetzt lt. IBExpert nur 16ms dauert.

Ich benötige aber das größe Datum von diesen drei Datensätzen. Habe ich das was falsch gemacht oder kann man da was optimieren.

Ach so das ganze dauer so lange bei mit also 16ms da in der Tabelle 58 Mio Datensätze vorhanden sind und es ein gang ganz alter Server ist mit noch richtigen Platten und keinen SSD. Ich nur zum entwicken gedacht und dazu genügt die Kiste noch.

Danke Dumpfbacke

Uwe Raabe 17. Jan 2022 09:58

AW: SQL optimimieren notwendig Max()
 
Diese Einschränkung ist redundant bzw. offenbar nicht so gemeint:
Delphi-Quellcode:

and Feld3 = 'klein' and Feld3 <> ''

Wenn
Delphi-Quellcode:
Feld3 = 'klein'
, dann ist natürlich immer auch
Delphi-Quellcode:
Feld3 <> ''
.

himitsu 17. Jan 2022 10:12

AW: SQL optimimieren notwendig Max()
 
Zu Feld2 und Feld3 gibt es auch passende Indize?

Dumpfbacke 17. Jan 2022 10:26

AW: SQL optimimieren notwendig Max()
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1500702)
Diese Einschränkung ist redundant bzw. offenbar nicht so gemeint:
Delphi-Quellcode:

and Feld3 = 'klein' and Feld3 <> ''

Wenn
Delphi-Quellcode:
Feld3 = 'klein'
, dann ist natürlich immer auch
Delphi-Quellcode:
Feld3 <> ''
.


Doch das ist so gewollt bzw. die Vorgabe. Die Felder sind nicht NULL sondern teilweise leer und diese sollen hier nicht berücksichtig werden.

Dumpfbacke 17. Jan 2022 10:28

AW: SQL optimimieren notwendig Max()
 
Zitat:

Zitat von himitsu (Beitrag 1500705)
Zu Feld2 und Feld3 gibt es auch passende Indize?


Ja es isgt ein Index über alle Leder hier. Wenn ich die einzelenn Zeilen mir hohe geht es ja auch super fix nur bei Max dauert es leider "so lange".

Frickler 17. Jan 2022 10:29

AW: SQL optimimieren notwendig Max()
 
Zitat:

Zitat von himitsu (Beitrag 1500705)
Zu Feld2 und Feld3 gibt es auch passende Indize?

Sie schreibt von "Kombi-Index", d.h. es gibt einen Index "feld1;feld2;feld3". Davon wird m.W. bei Firebird abgeraten. Besser 3 einzelne Indexe. Kombi-Index, das hat man mal gebraucht bei Paradox.

P.S.: was ist mit einer geschachtelten Abfrage a la
Code:
SELECT MAX(x.Feld1) FROM (SELECT Feld1 FROM ...) x

Delphi.Narium 17. Jan 2022 11:00

AW: SQL optimimieren notwendig Max()
 
Hab' ich das recht verstanden? Du suchst

SQL-Code:
Select datum From tabelle1 where Feld2 = 'Schraube' and Feld3 = 'klein' and Feld 3 <> ''


und davon dann den Satz mit dem höchsten Datum?

SQL-Code:
select max(Datum) as Max_Datum from (
  select datum
  from tabelle1 
  where Feld2 = 'Schraube' and Feld3 = 'klein' and Feld 3 <> ''
)
Damit werden erstmal "nur" die Sätze gesucht, die per Index und Bedingung wohl recht schnell gefunden werden.

Von der nun recht kleinen "Restmenge" suchen wir anschließend das höchste Datum.

Das kann, aus Erfahrung, je nach Konstellation schonmal so die eine oder andere Minute an Abfragezeit einsparen.

Dann hast Du einen Index auf Feld1, Feld2 und Feld3. Feld1 ist aber nicht in der Wherebedingung enthalten und hat hier, als erstes Feld im Index (eventuell) keine Auswirkung bzw. der Index wird nicht oder nicht optimal genutzt.

Was sagt denn der Ausführungsplan zu der Abfrage?

Probiere es bitte mal mit dem geschachtelten SQL und einem Index nur auf Feld2 und Feld3.

Zu Uwes Anmerkung bezüglich der Wherebedingung und Deiner Antwort:
Zitat:

Doch das ist so gewollt bzw. die Vorgabe. Die Felder sind nicht NULL sondern teilweise leer und diese sollen hier nicht berücksichtig werden.
Wenn Feld3 = 'klein' ist, gilt zwangsläufig: Feld3 <> ' '.
Wenn diese reduntante Prüfung laut Vorgabe gewollt ist, sollte man mal die Sinnhaftigkeit der Vorgabe überprüfen.

Vorteil: Die Datenbank spart sich damit eine unnütze Abfrage, was sich in Bezug auf die Laufzeit (ggfls. sogar die Nutzung des Index) durchaus positiv auswirken kann.

Dumpfbacke 17. Jan 2022 11:13

AW: SQL optimimieren notwendig Max()
 
Leider habe ich hier einen kleinen Tipfehler gemacht es muss richtig lauten Feld3 <> 'klein'. Aus diesem grund auch <> ''. Sorry. Ich habe es oben mal angepasst.

Dumpfbacke 17. Jan 2022 11:16

AW: SQL optimimieren notwendig Max()
 
[QUOTE=Delphi.Narium;1500711]Hab' ich das recht verstanden? Du suchst

und davon dann den Satz mit dem höchsten Datum?

SQL-Code:
select max(Datum) as Max_Datum from (
  select datum
  from tabelle1 
  where Feld2 = 'Schraube' and Feld3 = 'klein' and Feld 3 <> ''
)
Das dauert genau so lange wie meiner

IBExpert 17. Jan 2022 11:17

AW: SQL optimimieren notwendig Max()
 
es gäbe diverse weg wie man das optimieren kann, einzelindizes machen dem firebird server meistens das leben
einfacher, bei 68 mio records kann es aber auch mal ein kombinierter sein.

was versuchst du damit
and Feld3 = 'klein' and Feld 3 <> ''

wenn feld3 'klein' ist, dann kann es nicht '' sein

vorschlag

Indexreihefolge und anderes sql (sollte mit kombiniertem index "feld2, feld3, feld1 desc" nur in der Reihenfolge
ganz gut laufen, aber auch mit einzelindizes

Select first 1 Feld1 From tabelle1 where Feld2 = 'Schraube' and Feld3 = 'klein' order by feld1 desc

vorteil liegt darin, das der index nur bis zur einspungadresse gebraucht wird, keine gesamtauswertung machen muss
Sollte mit dem index wie aufgezeigt in richtiger reihenfolge oder einzelindizes auch gut laufen

Grund: wenn dein index mit feld1 losgeht aber das gar nicht für where gebraucht wird, ist der nahezu nutzlos
das ist auch der Grund warum einzelindizes oft besser sind, weil da der optimierer selber erkennen kann,
das zB in feld2 nur 1000 unterschiedliche werte sind und und feld3 zB 10000, das ist die sogenannte Selektivität.
wenn aber in feld1 zB ein timestamp ist, das kann es sein, das da drin 68 mio unterschiedliche werte sind

der kombindex der damit beginnt, ist völlig unbrauchbar

es wäre sicherlich hilfreich, reale metadaten zu posten und nicht immer nur handgeklöppelte sql beispiele
ebenso wie index strukturen und die echten sqls (auf der seite ddl in ibexpert findet man immer
alles auf einen blick und das ist auch selten Raketenwissenschaft, was man damit veröffentlicht,
außerdem sind wir alle hier ja unter uns 8-))


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:51 Uhr.
Seite 1 von 4  1 23     Letzte »    

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