Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Select Count(*) vs. Select First 1 (https://www.delphipraxis.net/192839-select-count-%2A-vs-select-first-1-a.html)

hoika 24. Mai 2017 06:28

Datenbank: FB • Version: 2.5 • Zugriff über: egal

Select Count(*) vs. Select First 1
 
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?

jobo 24. Mai 2017 06:44

AW: Select Count(*) vs. Select First 1
 
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.

ConnorMcLeod 24. Mai 2017 08:20

AW: Select Count(*) vs. Select First 1
 
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
;

Bernhard Geyer 24. Mai 2017 08:43

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

Zitat von ConnorMcLeod (Beitrag 1372607)
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).

ConnorMcLeod 24. Mai 2017 08:48

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

Zitat von Bernhard Geyer (Beitrag 1372609)
EOF

Stimmt, zugegeben. Ich hatte früher mal Schwierigkeiten mit Bof und Eof, daher vermeide ich es seit damals, wenn möglich. ;-) Mit Ausnahme von
Delphi-Quellcode:
while not eof do next
natürlich...

Blup 24. Mai 2017 08:57

AW: Select Count(*) vs. Select First 1
 
Nur wenn das "select count(1) RecCount" auf Grund der angegebenen Bedingung genau einen Datensatz ermittelt, ist es gleich schnell.

jobo 24. Mai 2017 09:07

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

Zitat von Blup (Beitrag 1372611)
Nur wenn das "select count(1) RecCount" auf Grund der angegebenen Bedingung genau einen Datensatz ermittelt, ist es gleich schnell.

Gleich schnell wie was?

hoika 24. Mai 2017 10:08

AW: Select Count(*) vs. Select First 1
 
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?.

TigerLilly 24. Mai 2017 10:27

AW: Select Count(*) vs. Select First 1
 
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.

Poelser 24. Mai 2017 10:34

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

Zitat von hoika (Beitrag 1372617)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:40 Uhr.
Seite 1 von 3  1 23      

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