AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken RecordCount vs. count(*). Was ist schneller?
Thema durchsuchen
Ansicht
Themen-Optionen

RecordCount vs. count(*). Was ist schneller?

Ein Thema von Jumpy · begonnen am 7. Dez 2011 · letzter Beitrag vom 7. Dez 2011
Antwort Antwort
Seite 1 von 2  1 2      
Jumpy

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

RecordCount vs. count(*). Was ist schneller?

  Alt 7. Dez 2011, 13:13
Datenbank: Oracle • Version: 10g • Zugriff über: ADO+ODBC
Hallo,

angenommen ich muss wissen, ob ein bestimmter Eintrag in einem bestimmten Feld einer Tabelle mindestens einmal existiert. Was ist dabei der bessere/schnellere Weg? Ist jetzt zwar zur Zeit eine theoretische Frage für mich, aber ich brauch so einem Mechanismus des öfteren und mach es mal so, mal so. Will aber mal einen einheitlichen optimalen Weg da suchen.

Im folgenden ist Quelle eine TADOQuery:

Variante 1: count(*)
Delphi-Quellcode:
function exists:Boolean;
begin
  Quelle.Close;
  Quelle.SQL.Text:='Select count(*) From myTable where myFeld = ''blub''';
  Quelle.Open;
  Result:=Quelle.Field[0].AsInteger>0;
  Quelle.Close;
end
Variante 2: count(IrgendeinFeld)
Delphi-Quellcode:
function exists:Boolean;
begin
  Quelle.Close;
  Quelle.SQL.Text:='Select count(myFeld) From myTable where myFeld = ''blub''';
  Quelle.Open;
  Result:=Quelle.Field[0].AsInteger>0;
  Quelle.Close;
end
Variante 3: RecordCount
Delphi-Quellcode:
function exists:Boolean;
begin
  Quelle.Close;
  Quelle.SQL.Text:='Select * From myTable where myFeld = ''blub''';
  Quelle.Open;
  Result:=Quelle.RecordCount>0;
  Quelle.Close;
end
Was ist eurer Meinung nach die optimalste Methode?
Gibts vllt. noch weitere Möglichkeiten, das schnell zu ermitteln?
Würden Indizes da was beschleunigen können?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: RecordCount vs. count(*). Was ist schneller?

  Alt 7. Dez 2011, 13:20
Einfache Überlegung
  1. Geschickte Indizes beschleunigen den Zugriff auf die Daten. Gibt es für die Felder im WHERE einen Index dann wird eben nur dieser durchsucht
  2. Bei SELECT * FROM werden alle Datensätze übertragen, bei SELECT COUNT(*) FROM wird nur ein (sehr kleiner) Datensatz übertragen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
jobo

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

AW: RecordCount vs. count(*). Was ist schneller?

  Alt 7. Dez 2011, 13:30
Also ein Count(*) zwingt die Engine ja, alles durzuorgeln.
Select dagegen scheint mir sanfter. Vlt noch ein first rows hint spendieren, dann weiß der Optimizer, worums geht.
Dann wäre da noch rownum < 2, bin mir aber nicht sicher, ob das (in Kombi mit dem Hint) wirklich dann den vollen Aufbau des Cursors verhindert.
Gruß, Jo
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: RecordCount vs. count(*). Was ist schneller?

  Alt 7. Dez 2011, 13:30
Noch eine Variante
Code:
Select myFeld From myTable where myFeld = ''blub'' LIMIT 1';
Mit RecordCount. (Je nach SQL Dialekt statt "LIMIT" "SELECT FIRST n".) Ich hab keine Speed-Tests gemacht, aber das gibt eben auch immer nur eine kleine Antwort, und spart dem Server ggf. das Zählen.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: RecordCount vs. count(*). Was ist schneller?

  Alt 7. Dez 2011, 13:41
Also ein Count(*) zwingt die Engine ja, alles durzuorgeln.
Select dagegen scheint mir sanfter.
Beim Select muss die Datenbank ebenfalls durchorgeln und zusätzlich auch das Resultset temporär vorhalten.
Und wenn du wie bei MySQL eigentlich nur geht mit clientseitigen Curser arbeitest wird das "durchorgel"-Ergebnis auch noch zum Client übertragen.

Falls du nur ungefähre Angaben benötigst kannst du auf die Statistikdaten der DB zurückgreifen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Jumpy

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

AW: RecordCount vs. count(*). Was ist schneller?

  Alt 7. Dez 2011, 14:13
Eine einheitliche Meinung hab ich aus euren Beiträgen da noch nicht rausgehört, was mir zum einen sagt, dass die Frage nicht so dumm war, wie ich befürchtet habe, und zum anderen, dass sich die Frage nicht pauschall beantworten läßt. DIE Lösung gibt's also scheinbar nicht.

Es steht scheinbar "welche Datenmenge muss durchgeorgelt werden" gegenüber "welche Datenmenge muss übertragen werden".
Ralph
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#7

AW: RecordCount vs. count(*). Was ist schneller?

  Alt 7. Dez 2011, 14:28
Das Google Orakel orakelt bei Oracle
Code:
select 1 from dual where exists (select 'x' from MyTable);
oder
Code:
select 1 from MyTable where ROW_NUM=1;
Beides liefert entweder eine leere Tabelle oder eine Tabelle mit einer Zeile.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#8

AW: RecordCount vs. count(*). Was ist schneller?

  Alt 7. Dez 2011, 14:31
Je nach Datenbank läuft Select Count(*) auf einen reinen Index Scan hinaus ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Jumpy

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

AW: RecordCount vs. count(*). Was ist schneller?

  Alt 7. Dez 2011, 14:37
Das Google Orakel orakelt bei Oracle
Code:
select 1 from dual where exists (select 'x' from MyTable);
oder
Code:
select 1 from MyTable where ROW_NUM=1;
Beides liefert entweder eine leere Tabelle oder eine Tabelle mit einer Zeile.
Damit prüf ich ob eine Tabelle existiert, oder?
Wäre also gut, um einen Spezialfall der Anforderung zu ersetzen:
Code:
function TABLEexists:Boolean;
begin
  Quelle.Close;
  Quelle.SQL.Text:='Select count(*) From All_Tables where Table_name = ''blub''';
  Quelle.Open;
  Result:=Quelle.Field[0].AsInteger>0;
  Quelle.Close;
end
Oder hab ich das falsch verstanden?
Ralph
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#10

AW: RecordCount vs. count(*). Was ist schneller?

  Alt 7. Dez 2011, 14:48
Ne
Damit prüf ich ob eine Tabelle existiert, oder?
Nope, damit prüfst Du, ob die Tabelle leer ist, oder nicht.
In Delphi, ungefähr so:

Delphi-Quellcode:
function TABLEexists (MyTableName : String) :Boolean;
begin
  Quelle.Close;
  Quelle.SQL.Text:=Format('select 1 from dual where exists (select 1 from %s)',[MyTableName]);
  Quelle.Open;
  Result:=Not Quelle.IsEmpty;
  Quelle.Close;
end
  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 19:01 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