Es gibt eine Artikel die zeigen, dass die COUNT(1)
en Oracle ist nur ein Alias für COUNT(*)
, mit einer Nachweis darüber.
Ich werde einige Teile zitieren:
Es gibt einen Teil der Datenbanksoftware, der sich "The Optimizer", der in der offiziellen Dokumentation wie folgt definiert ist "Eingebaute Datenbanksoftware, die den effizientesten Weg zur Ausführung einer Ausführung einer SQL-Anweisung".
Eine der Komponenten des Optimierers wird als "Transformator" bezeichnet, deren Aufgabe es ist, festzustellen, ob es vorteilhaft ist, die ursprüngliche SQL-Anweisung in eine semantisch äquivalente SQL-Anweisung umzuschreiben, die effizienter sein könnte.
Möchten Sie sehen, was der Optimierer macht, wenn Sie eine Abfrage schreiben mit COUNT(1) schreiben?
Bei einem Benutzer mit ALTER SESSION
Privileg, können Sie eine tracefile_identifier
aktivieren Sie das Tracing des Optimierers und führen Sie die COUNT(1)
wählen, wie: SELECT /* test-1 */ COUNT(1) FROM employees;
.
Danach müssen Sie die Trace-Dateien lokalisieren, was Sie mit SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Diag Trace';
. Später in der Datei werden Sie finden:
SELECT COUNT(*) “COUNT(1)” FROM “COURSE”.”EMPLOYEES” “EMPLOYEES”
Wie Sie sehen können, ist es nur ein Alias für COUNT(*)
.
Eine weitere wichtige Bemerkung: Die COUNT(*)
war wirklich schneller vor zwei Jahrzehnten auf Oracle, vor Oracle 7.3:
Count(1) ist seit 7.3 in count(*) umgeschrieben worden, weil Oracle gerne mythische Anweisungen automatisch abstimmt. In früheren Oracle7 musste Oracle (1) für jede Zeile als Funktion auswerten, bevor DETERMINISTIC und NON-DETERMINISTIC existieren.
Vor zwei Jahrzehnten war count(*) also schneller
Bei anderen Datenbanken wie Sql Server sollte dies für jede Datenbank einzeln untersucht werden.
Ich weiß, dass diese Frage spezifisch für Sql Server ist, aber die anderen Fragen auf SO über das gleiche Thema, ohne Erwähnung der Datenbank, wurde geschlossen und als dupliziert von dieser Antwort markiert.