AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Select Count(*) vs. Select First 1
Thema durchsuchen
Ansicht
Themen-Optionen

Select Count(*) vs. Select First 1

Ein Thema von hoika · begonnen am 24. Mai 2017 · letzter Beitrag vom 27. Mai 2017
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#1

Select Count(*) vs. Select First 1

  Alt 24. Mai 2017, 07:28
Datenbank: FB • Version: 2.5 • Zugriff über: egal
Hallo,
bei einer üblichen Performance-Analyse sehe ich mal wieder alten Code mit dem üblichen Select Count(*) .

Um festzustellen, ob es einen Datensatz bereits gibt,
kann ich ja Select Count(*) oder Select First 1 nehmen.

Nehmen wir mal, an das Ergebnis das Count(*) wären 20 Einträge.
Ist das Select First 1 nicht perse schneller,
weil beim Finden des ersten Datensatzes sofort abgebrochen wird?
Ich benutze ein normales Where, kein Like, der Index wird also direkt benutzt.

Das Suchfeld ist natürlich indiziert und nicht der Primary Key.

Was meint ihr?
Heiko

Geändert von hoika (24. Mai 2017 um 07:34 Uhr)
  Mit Zitat antworten Zitat
jobo

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

AW: Select Count(*) vs. Select First 1

  Alt 24. Mai 2017, 07:44
Klar, das count(*) muss einen kompletten Fullscan machen (wenn nicht Indizes benutzt werden können)
Das First start sicher anlaog mit einem Fullscann, kann aber abbrechen. Wenn es auch so implementiert ist, dass es das tut, ist es schneller.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Select Count(*) vs. Select First 1

  Alt 24. Mai 2017, 09:20
Es gibt Dialekte bzw Komponenten, die kein RecordCount zulassen. In diesen Fällen ist es sicherer so:
Delphi-Quellcode:
select
  count(1) RecCount
from
  t_tabelle
;
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.210 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Select Count(*) vs. Select First 1

  Alt 24. Mai 2017, 09:43
Es gibt Dialekte bzw Komponenten, die kein RecordCount zulassen. In diesen Fällen ist es sicherer so:
Delphi-Quellcode:
select
  count(1) RecCount
from
  t_tabelle
;
Wenn man mit Select First 1/Top 1 arbeitet, so braucht man kein RecordCount, sondern nur die Abfrage ob man überhaupt einen Datensatz nach dem öffnen der Query vor sich hat (.EOF).
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Select Count(*) vs. Select First 1

  Alt 24. Mai 2017, 09:48
Stimmt, zugegeben. Ich hatte früher mal Schwierigkeiten mit Bof und Eof, daher vermeide ich es seit damals, wenn möglich. Mit Ausnahme von while not eof do next natürlich...
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#6

AW: Select Count(*) vs. Select First 1

  Alt 24. Mai 2017, 09:57
Nur wenn das "select count(1) RecCount" auf Grund der angegebenen Bedingung genau einen Datensatz ermittelt, ist es gleich schnell.
  Mit Zitat antworten Zitat
jobo

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

AW: Select Count(*) vs. Select First 1

  Alt 24. Mai 2017, 10:07
Nur wenn das "select count(1) RecCount" auf Grund der angegebenen Bedingung genau einen Datensatz ermittelt, ist es gleich schnell.
Gleich schnell wie was?
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Select Count(*) vs. Select First 1

  Alt 24. Mai 2017, 22:15
Hallo,
bei einer üblichen Performance-Analyse sehe ich mal wieder alten Code mit dem üblichen Select Count(*) .
Was für eine Performance?
Falls das Count wirklich auf dem Client stattfinden sollte, was ich für einige DBMS ausschließen kann, mißt Du hier eine fröhliche Summe von Einflußfaktoren. Wenn das Ergebnis nicht schnell genug zur Verfügung steht, kann alles mögliche hierauf Einfluß haben.
Wird das Count auf dem Server ausgeführt, hat man zumindest eine Näherung zu was die DB auf dem Server bei der augenblicklichen Konfiguration in der Lage ist.

Gruß
K-H

Zumindest bei den mir zur Verfügung stehenden Oracle-DB ist Count(*) immer sauschnell 10 Mio-Datensätze <3 sec
Was leider keine Aussage über die Datenbereitstellung anderer Abfragen erlaubt.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
688 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Select Count(*) vs. Select First 1

  Alt 24. Mai 2017, 22:34
Zumindest bei den mir zur Verfügung stehenden Oracle-DB ist Count(*) immer sauschnell 10 Mio-Datensätze <3 sec
Was leider keine Aussage über die Datenbereitstellung anderer Abfragen erlaubt.
Das ist an sich noch nichts wo man vor Erfurcht zusammenbrechen muss ...

Leider benutzen viele Kunden irgendwelche Server, die irgendwas sicher auch ganz schnell können,
aber für Firebird kompletter Schrott sind und trotzdem sauteuer.

Wenn man die dann mit sauteuren uund hochoptimierten Oracle oder MSSQL Servern vergleicht,
kommt da nichts bei raus. Und frag am besten weder Dell, HP noch Lenovo nach geeigneter
Firebird Hardware, die Systemhäuser stellen da nur teuren Quatsch zusammen.

Diesen Test hab ich gerade auf einer Kunden DB gemacht, count(*) für ca 3mio Datensätze
in ca. 0,6 Sekunden

Die Serverhardware ist von uns geliefert, kostet mit 1TB ca 3500 € und schafft
einen IBExpert Firebird Benchmark von >=500% Driveindex und >=300% CPU Index
und ist transaktionsecht live auf einer zweiten baugleichen Maschine repliziert.

Vermutlich ab nächste Woche bieten wir die auch wieder außerhalb von Kundenprojekten an
und im Herbst machen wir damit vermutlich mal wieder eine Roadshow.


Code:

query:

Select count(*) from brpst

COUNT
2979487

Plan
PLAN (BRPST NATURAL)

------ Performance info ------
Prepare time = 16ms
Execute time = 625ms
Avg fetch time = 625,00 ms
Current memory = 1.171.921.280
Max memory = 0
Memory buffers = 40.000
Reads from disk to cache = 6.955
Writes from cache to disk = 2
Fetches from cache = 0
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
Benutzerbild von p80286
p80286

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

AW: Select Count(*) vs. Select First 1

  Alt 25. Mai 2017, 10:12

Das ist an sich noch nichts wo man vor Erfurcht zusammenbrechen muss ...
sollst Du auch nicht, mir ging es eher darum klar zu machen, daß es in der Praxis vor dem Client ab einer gewissen Zeitspanne egal ist ob ein zwei Zehntel eingespart werden.

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


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 21:33 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 by Thomas Breitkreuz