![]() |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 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