![]() |
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:
Variante 2: count(IrgendeinFeld)
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
Delphi-Quellcode:
Variante 3: RecordCount
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
Delphi-Quellcode:
Was ist eurer Meinung nach die optimalste Methode?
function exists:Boolean;
begin Quelle.Close; Quelle.SQL.Text:='Select * From myTable where myFeld = ''blub'''; Quelle.Open; Result:=Quelle.RecordCount>0; Quelle.Close; end Gibts vllt. noch weitere Möglichkeiten, das schnell zu ermitteln? Würden Indizes da was beschleunigen können? |
AW: RecordCount vs. count(*). Was ist schneller?
Einfache Überlegung
|
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. |
AW: RecordCount vs. count(*). Was ist schneller?
Noch eine Variante
Code:
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.
Select myFeld From myTable where myFeld = ''blub'' LIMIT 1';
|
AW: RecordCount vs. count(*). Was ist schneller?
Zitat:
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. |
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". |
AW: RecordCount vs. count(*). Was ist schneller?
Das Google Orakel orakelt bei Oracle
Code:
oder
select 1 from dual where exists (select 'x' from MyTable);
Code:
Beides liefert entweder eine leere Tabelle oder eine Tabelle mit einer Zeile.
select 1 from MyTable where ROW_NUM=1;
|
AW: RecordCount vs. count(*). Was ist schneller?
Je nach Datenbank läuft Select Count(*) auf einen reinen Index Scan hinaus ...
|
AW: RecordCount vs. count(*). Was ist schneller?
Zitat:
Wäre also gut, um einen Spezialfall der Anforderung zu ersetzen:
Code:
Oder hab ich das falsch verstanden?
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 |
AW: RecordCount vs. count(*). Was ist schneller?
Ne
Zitat:
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 |
AW: RecordCount vs. count(*). Was ist schneller?
Warum testest du die Varianten nicht aus?
Hab eben mal getestet auf interbase xe... myfeld varchar(32) index vorhanden Suchstring ist 2368 mal vorhanden Tabelle hat 554832 Datensätze
Code:
select count(myfeld) from Tabelle where myfeld=:Suchstring
time: 00:00:00.0031 (1 mal) time: 00:00:02.0406 (100 mal hintereinander) select 1 from Tabelle where myfeld=:Suchstring rows 1 time: 00:00:00.0016 (1 mal) time: 00:00:00.0516 (100 mal hintereinander) select myfeld from Tabelle where myfeld=:Suchstring rows 1; time: 00:00:00.0016 (1 mal) time: 00:00:00.0500 (100 mal hintereinander) select count(*) from Tabelle where myfeld=:Suchstring time: 00:00:00.0031 (1 mal) time: 00:00:02.0532 (100 mal hintereinander) select myfeld from Tabelle where myfeld=:Suchstring time: 00:00:00.0078 (1 mal) time: 00:00:07.0953 (100 mal hintereinander) Daraus ergibt sich ein klarer Vorteil beim limitieren der Datensätze! |
AW: RecordCount vs. count(*). Was ist schneller?
Hallo,
Count(*) und Count(field) tun sich nicht viel. Solange du nicht Select * nimmst, wirst du keinerlei Probleme haben. Ich benutze Count(*), weil das u.a. in FB (ich weiss, es geht um Oracle) optimiert wurde, ich glaube das Select (Field) nicht. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:30 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-2025 by Thomas Breitkreuz