2009-09-10 3 views
9

In Oracle, wenn Abfrage für Zeilen Existenz, warum ist Select 1 schneller als Select count (*)?Warum ist Select 1 schneller als Select count (*)?

+1

ohne zu wissen, welche RDBMS-Engine Sie verwenden, gibt es keine Möglichkeit, richtig zu beantworten. Unterschiedliche Engines verhalten sich anders – Glen

+1

Meinst du "warum zählt (1) schneller als Select count (*)"? –

+0

Ich meine "Select 1".Ich schaue mir einige alte, Offline-Coding-Standards Dokumentation an, wo behauptet wird, dass "Select 1" schneller ist als "Select count (*)", und eine bevorzugte Möglichkeit, um das Vorhandensein von Zeilen abzufragen. Die Dokumentation bietet keine technische Erklärung dafür, warum dies eine "leistungssteigernde" Technik ist. Als ich im Internet recherchierte, fand ich Dinge wie AskTom-Threads und Debatten ... aber ich sah keine klare, definitive Antwort. –

Antwort

14

Da Oracle nicht IF unterstützt VORHANDEN in PL/SQL, CodeByMidnight Vorschlag würde normalerweise mit so etwas wie

SELECT 1 
    INTO l_local_variable 
    FROM dual 
WHERE EXISTS( 
    SELECT 1 
     FROM some_table 
    WHERE some_column = some_condition); 

Oracle kennt getan werden EXISTS zu verwenden, dass es die WHERE-Klausel VORHANDEN Verarbeitung zu stoppen, sobald Eine Zeile wird gefunden, sodass keine große Anzahl von Zeilen gezählt werden muss, die den Kriterien entsprechen. Dies ist natürlich weniger bedenklich, wenn Sie überprüfen, ob eine Zeile mit einem bestimmten Schlüssel vorhanden ist, als wenn Sie eine Bedingung mit nicht indizierten Spalten prüfen oder eine Bedingung prüfen, die dazu führen kann, dass eine große Anzahl von Zeilen zurückgegeben wird.

(Hinweis: Ich wünschte, ich könnte dies als Kommentar auf CodeByMidnights Post, aber Kommentare können nicht formatierten Code enthalten).

UPDATE: Angesichts der Klarstellung der ursprünglichen Poster in ihrem Kommentar gemacht, ist die kurze, endgültige Antwort, dass eine SELECT 1 oder SELECT COUNT(1) ist nicht schneller als eine SELECT COUNT(*). Im Gegensatz zu den Codierungsrichtlinien, die Sie betrachten, ist COUNT(*) die bevorzugte Methode zum Zählen aller Zeilen. Es gab einen alten Mythos, dass ein COUNT(1) schneller war. Zumindest war dies in keiner Version von Oracle, die im letzten Jahrzehnt veröffentlicht wurde, wahr und es ist unwahrscheinlich, dass es jemals wahr war. Es war jedoch ein weit verbreiteter Glaube. Heute macht Code, der eine COUNT(1) eher als eine COUNT(*) macht im Allgemeinen mich vermuten, dass der Autor anfällig ist, verschiedene Oracle-Mythen zu glauben, weshalb ich vorschlagen würde, COUNT(*) zu verwenden.

0

Da ein Stern alle Spalten in die Zählung aufnimmt, ist "1" ein nativer Datentyp.

In MySQL "SELECT COUNT (name_of_the_primary_key)" sollte so schnell sein wie Ihre SELECT 1. Es ist der Index, der zählt.)

2

Ich wäre überrascht, wenn die Anzahl (*) nicht richtig optimiert wurde, müssen nicht alle Spalten geladen werden, da es keine spaltenbezogene Verarbeitung gibt.

+1

ja. Oracle behandelt count (*) genauso wie count (1), count (null), count ('beliebiger Atomwert, den Sie mögen'). –

15

Es ist besser, noch EXISTS zu verwenden, wo das RDBMS es unterstützt oder ein Äquivalent, da dies die Verarbeitung von Zeilen beendet, sobald eine Übereinstimmung gefunden wird.

+5

+1 Wir sollten nur COUNT() verwenden, wir müssen die tatsächliche Anzahl der beteiligten Datensätze wissen. – APC

0

Alle anderen Dinge gleich sind, wird "select 1 from my_table" die erste Ergebnis zurück schneller als "select count(*) from my_table", aber wenn Sie alle Ergebnisse aus der Abfrage abgerufen werden, wird die count(*) ein schneller sein, weil es viel weniger Daten (1 ganze Zahl beinhaltet, wie im Gegensatz zu 1 Integer pro Zeile in der Tabelle).