AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Ergebnismenge beschränken mit "LIMIT" oder "TOP"
Thema durchsuchen
Ansicht
Themen-Optionen

Ergebnismenge beschränken mit "LIMIT" oder "TOP"

Ein Thema von Der schöne Günther · begonnen am 19. Feb 2018 · letzter Beitrag vom 22. Feb 2018
Antwort Antwort
Seite 1 von 2  1 2      
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Ergebnismenge beschränken mit "LIMIT" oder "TOP"

  Alt 20. Feb 2018, 18:55
Ein
Code:
SELECT COUNT(*) where Bedingung
kann ich mir nicht leisten, die Bedingung ist komplex.

Das dauert so lange dass man sich erst einmal einen Kaffee holen kann. Zumindest wenn in der Datenbank schon ein paar Millionen Datensätze stecken.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.403 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Ergebnismenge beschränken mit "LIMIT" oder "TOP"

  Alt 20. Feb 2018, 19:03
Ein
Code:
SELECT COUNT(*) where Bedingung
kann ich mir nicht leisten, die Bedingung ist komplex.

Das dauert so lange dass man sich erst einmal einen Kaffee holen kann. Zumindest wenn in der Datenbank schon ein paar Millionen Datensätze stecken.
das ist doch schon mal was. Wenn die Abfrage wirklich so lange dauert, dann würde ich nicht nur hundert DS abrufen sondern deutlich mehr, bei einer lang laufenden Abfragen spielt dann ein Fetch von ein paar Sekunden dann auch keine Rolle mehr. Die Anzeige in der Oberfläche kannst Du dann anhand der lokalen Datenmenge einschränken und kannst dann deine Anzeige entsprechend gestalten, dass der Anwender noch mehr Datensätze abrufen kann..
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Ergebnismenge beschränken mit "LIMIT" oder "TOP"

  Alt 21. Feb 2018, 17:11
Vielen Dank für alle Antworten. Auf drei Seiten habe ich es mit einer Frage schon lange nicht mehr geschafft

Ich kann meine Tabellenstruktur und Query gerne zur Diskussion stellen, die Frage "Wie optimiere ich diese spezielle Query?" ist dann aber sicher ein eigenes Thema wert.

Ich muss noch einmal klarstellen:
  1. Ich habe kein Performance-Problem. Typischerweise wird die Treffermenge nach einem Zeitstempel eingeschränkt, auf diesem liegt ein Index. Typischerweise sind immer die neusten interessant. Es macht nur Sinn wenn diese GEORDNET nach Zeit aufeinander folgen.
  2. Ich habe die Query nun auf tausend Treffer limitiert und bekomme auch in gigabyte-großen Datenbanken mein Ergebnis in wenigen Millisekunden
  3. Das Select COUNT(*) dauert, denke ich, so lange nicht weil die Bedingung zu komplex wäre, sondern weil wir hier über große Daten- und Treffermengen sprechen.
  4. Ich bin mit der "+1"-Lösung zufrieden denn an sich entspringt kein Nutzen wenn ich weiß dass ich theoretisch 1,4 Millionen Treffer hätte haben können wenn der Arbeitsspeicher unendlich wäre.

Mein Anwendungsfall ist ein Datengrab in das kontinuierlich neue Messwerte gesteckt werden. Die Datenbank wird verwendet um entweder einen bestimmten Zeitbereich später genauer untersuchen zu können oder z.B. eine grafische Auswertung über einen längeren Zeitraum (mehrere Tage) zu malen. Dabei kommt es typischerweise vor dass man mehr über die jüngste Vergangenheit wissen will, trotzdem sollte man auch ein paar Monate zurück reisen können.

Für die ganz neugierigen, das war (ungefähr) die Query:

Code:
select
   tabelle1.pkey,
   [zeitstempel],
   [kurzerText],
   [kommazahl],
   [ganzzahl]
FROM
   tabelle1 JOIN tabelle2
ON
   (tabelle1.pkey = tabelle2.tabelle1_pkey)
WHERE
   (
      ((tabelle1.zeitstempel >= :timeMin) OR (CAST(:timeMin as SQL_TIMESTAMP) is NULL))
   AND
      ((tabelle1.zeitstempel <= :timeMax) OR (CAST(:timeMax as SQL_TIMESTAMP) is NULL))
   AND
      ((tabelle1.kurzerText = :textParameter) or ( CAST(:textParameter as SQL_VARCHAR) is NULL ))
   )
ORDER BY [zeitstempel] DESC LIMIT 1000;

Geändert von Der schöne Günther (21. Feb 2018 um 17:59 Uhr) Grund: SQL-Statement besser lesbar gemacht
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.880 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Ergebnismenge beschränken mit "LIMIT" oder "TOP"

  Alt 21. Feb 2018, 17:18
Wirklich
Zitat:
SQL-Code:
ON
   (tabelle1.pkey = tabelle1_pkey)
?

-Die Prüfung auf NULL der Parameter besser vor dem Filter der Tabelle auf den Parameter ( (( CAST(:textParameter as SQL_VARCHAR) is NULL ) or (tabelle1.kurzerText = :textParameter)) )

-Möglicherweise hilft eine DERIVED TABLE
Markus Kinzler
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Ergebnismenge beschränken mit "LIMIT" oder "TOP"

  Alt 21. Feb 2018, 17:29
tabelle1_pkey ist der FKEY von tabelle2 auf tabelle1 . Ja. Habe ich was dummes gemacht?

Die Prüfung auf NULL der Parameter besser vor dem Filter
Guter Tipp.

Derived Tables höre ich zum ersten mal, ich schaue mal was das ist...
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: Ergebnismenge beschränken mit "LIMIT" oder "TOP"

  Alt 21. Feb 2018, 17:52
tabelle1_pkey ist der FKEY von tabelle2 auf tabelle1 . Ja. Habe ich was dummes gemacht?
Ich hab auch erst gestutzt, weil ich "tabelle1.pkey = tabelle1.pkey" gelesen hatte und dann erst nachher gesehen habe, das da ja ein Unterstrich war. Mit "tabelle2.tabelle1_pkey" wäre es vllt. nicht so ins Auge gesprungen.
Ralph
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Ergebnismenge beschränken mit "LIMIT" oder "TOP"

  Alt 21. Feb 2018, 17:59
Das stimmt, ich habe es abgeändert. Danke.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: Ergebnismenge beschränken mit "LIMIT" oder "TOP"

  Alt 22. Feb 2018, 11:01
Wieso war ich der Meinung, dass es um SQLite geht?
Keine Ahnung.

Letztlich scheint sich ja alles in Wohlgefallen aufzulösen, auch wenn ich da zwischendrin Widersprüche sehe.
Zitat von Der schöne Günther:
[*]Ich habe kein Performance-Problem.
Zitat von Der schöne Günther:
Ein
Code:
SELECT COUNT(*) where Bedingung
kann ich mir nicht leisten, die Bedingung ist komplex. Das dauert so lange dass man sich erst einmal einen Kaffee holen kann. ..
"Datengräber" sind ja dann vielleicht auch wie der Name andeutet nicht unbedingt etwas für adhoc Zugriff. Bewegung im Grab ist langsam. Will man trotzdem "at your fingertips" haben, geht es Richtung Datawarehouse, Starschema usw., die Daten werden nicht nur begraben, sondern man notiert sich einmalig wann, wieviel, wovon, wo und bietet das zum Browsen an.

Jenseits von SQLite gibt es natürlich in echten RDBMS und ohne gleich ein Datawarehouse zu eröffnen auch Technologien, die eine bessere Skalierung der Zugriffszeiten ermöglichen, "Partitionierung" mal als ein Stichwort.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Ergebnismenge beschränken mit "LIMIT" oder "TOP"

  Alt 22. Feb 2018, 13:15
Ich habe mit der Abfrage ein leichtes Problem
SQL-Code:
select
   tabelle1.pkey,
   [zeitstempel],
   [kurzerText],
   [kommazahl],
   [ganzzahl]
FROM
   tabelle1 JOIN tabelle2
ON
   (tabelle1.pkey = tabelle2.tabelle1_pkey)
WHERE
   (
      ((tabelle1.zeitstempel >= :timeMin) OR (CAST(:timeMin as SQL_TIMESTAMP) is NULL))
   AND
      ((tabelle1.zeitstempel <= :timeMax) OR (CAST(:timeMax as SQL_TIMESTAMP) is NULL))
   AND
      ((tabelle1.kurzerText = :textParameter) or ( CAST(:textParameter as SQL_VARCHAR) is NULL ))
   )
ORDER BY [zeitstempel] DESC LIMIT 1000;
Das liest sich wie, wenn keine Werte (min,max,text) übergeben werden, dann liefere alles!
Wahrscheinlich gibt es in der GUI eine Logik, die das verhindert aber Unbehagen bereitet mir das trotzdem.
Ad hoc würde ich da drei Abfragen verwenden.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#10

AW: Ergebnismenge beschränken mit "LIMIT" oder "TOP"

  Alt 22. Feb 2018, 13:35
Naja, halt die letzten 1000?
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz