AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL optimimieren notwendig Max()
Thema durchsuchen
Ansicht
Themen-Optionen

SQL optimimieren notwendig Max()

Ein Thema von Dumpfbacke · begonnen am 17. Jan 2022 · letzter Beitrag vom 24. Jan 2022
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

SQL optimimieren notwendig Max()

  Alt 17. Jan 2022, 10:51
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBExpert
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.

Select Max(Feld1) From tabelle1 where Feld2 = 'Schraubeand Feld3 <> 'kleinand 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
Tanja

Geändert von Dumpfbacke (17. Jan 2022 um 13:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#2

AW: SQL optimimieren notwendig Max()

  Alt 17. Jan 2022, 10:58
Diese Einschränkung ist redundant bzw. offenbar nicht so gemeint:
Delphi-Quellcode:

and Feld3 = 'kleinand Feld3 <> ''

Wenn Feld3 = 'klein' , dann ist natürlich immer auch Feld3 <> '' .
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: SQL optimimieren notwendig Max()

  Alt 17. Jan 2022, 11:12
Zu Feld2 und Feld3 gibt es auch passende Indize?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: SQL optimimieren notwendig Max()

  Alt 17. Jan 2022, 11:26
Diese Einschränkung ist redundant bzw. offenbar nicht so gemeint:
Delphi-Quellcode:

and Feld3 = 'kleinand Feld3 <> ''

Wenn Feld3 = 'klein' , dann ist natürlich immer auch 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.
Tanja

Geändert von Dumpfbacke (17. Jan 2022 um 11:29 Uhr)
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: SQL optimimieren notwendig Max()

  Alt 17. Jan 2022, 11:28
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".
Tanja
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
591 Beiträge
 
Delphi XE6 Enterprise
 
#6

AW: SQL optimimieren notwendig Max()

  Alt 17. Jan 2022, 11:29
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

Geändert von Frickler (17. Jan 2022 um 11:33 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#7

AW: SQL optimimieren notwendig Max()

  Alt 17. Jan 2022, 12:00
Hab' ich das recht verstanden? Du suchst

Select datum From tabelle1 where Feld2 = 'Schraubeand Feld3 = 'kleinand 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 = 'Schraubeand Feld3 = 'kleinand 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.
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: SQL optimimieren notwendig Max()

  Alt 17. Jan 2022, 12:13
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.
Tanja

Geändert von Dumpfbacke (17. Jan 2022 um 12:45 Uhr)
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: SQL optimimieren notwendig Max()

  Alt 17. Jan 2022, 12:16
[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 = 'Schraubeand Feld3 = 'kleinand Feld 3 <> ''
)
Das dauert genau so lange wie meiner
Tanja

Geändert von Dumpfbacke (17. Jan 2022 um 12:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
672 Beiträge
 
FreePascal / Lazarus
 
#10

AW: SQL optimimieren notwendig Max()

  Alt 17. Jan 2022, 12:17
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 )
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 08:23 Uhr.
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