Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   RecordCount vs. count(*). Was ist schneller? (https://www.delphipraxis.net/164949-recordcount-vs-count-%2A-ist-schneller.html)

Jumpy 7. Dez 2011 12:13

Datenbank: Oracle • Version: 10g • Zugriff über: ADO+ODBC

RecordCount vs. count(*). Was ist schneller?
 
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?

Sir Rufo 7. Dez 2011 12:20

AW: RecordCount vs. count(*). Was ist schneller?
 
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

jobo 7. Dez 2011 12:30

AW: RecordCount vs. count(*). Was ist schneller?
 
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.

Medium 7. Dez 2011 12:30

AW: RecordCount vs. count(*). Was ist schneller?
 
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.

Bernhard Geyer 7. Dez 2011 12:41

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

Zitat von jobo (Beitrag 1140014)
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.

Jumpy 7. Dez 2011 13:13

AW: RecordCount vs. count(*). Was ist schneller?
 
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".

Iwo Asnet 7. Dez 2011 13:28

AW: RecordCount vs. count(*). Was ist schneller?
 
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.

Bummi 7. Dez 2011 13:31

AW: RecordCount vs. count(*). Was ist schneller?
 
Je nach Datenbank läuft Select Count(*) auf einen reinen Index Scan hinaus ...

Jumpy 7. Dez 2011 13:37

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

Zitat von Iwo Asnet (Beitrag 1140040)
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?

Iwo Asnet 7. Dez 2011 13:48

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

Zitat von Jumpy (Beitrag 1140045)
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:18 Uhr.
Seite 1 von 2  1 2      

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