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
Seite 1 von 3  1 23      
hoika

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

Select Count(*) vs. Select First 1

  Alt 24. Mai 2017, 06: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 06: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, 06: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, 08: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.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 24. Mai 2017, 08: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, 08: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.429 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 24. Mai 2017, 08: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, 09: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
hoika

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

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

  Alt 24. Mai 2017, 10:08
Hallo,
ich arbeite nur mit Firebird, also gibt es das First auf jeden Fall.

Zitat:
Klar, das count(*) muss einen kompletten Fullscan machen (wenn nicht Indizes benutzt werden können)
Es werden Indizes benutzt.

Also sollte man auf jeden Fall davon ausgehen,
dass das First schneller als das Count(*) ist, richtig?.
Heiko

Geändert von hoika (24. Mai 2017 um 10:11 Uhr)
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.174 Beiträge
 
Delphi 11 Alexandria
 
#9

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

  Alt 24. Mai 2017, 10:27
RecordCount wird am Client(!) ermittelt + kann bei genug Datensätzen lange brauchen, weil alle Datensätze abgerufen werden + gezählt werden. Das war auch nicht die Frage. :-/

select first 1 vs select Count(*) vs select count(1) vs select 1 ist alles gleich schnell. Da wiegt Netzwerk, Latenz und Parsezeit viel mehr.
  Mit Zitat antworten Zitat
Poelser

Registriert seit: 21. Apr 2008
Ort: Europa
145 Beiträge
 
Delphi 10.4 Sydney
 
#10

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

  Alt 24. Mai 2017, 10:34
Also sollte man auf jeden Fall davon ausgehen,
dass das First schneller als das Count(*) ist, richtig?.
Das würde ich nicht unbedingt unterschreiben.
Adaptive Server Anywhere z.B. meckert beim First rum, dass das Ergebnis nicht deterministisch sein würde. Zurecht, denn die DB-Engine weiß ja nicht, dass mir der Inhalte des zurückgelieferten Datensatzes in diesem Fall egal ist.
Das umgeht man, indem ein Order By benutzt wird - und damit könnte wieder ein Full Table Scan drohen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 07:15 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