Was ist der Unterschied zwischen select count (*) und select count (any_non_null_column)?

58

Ich scheine mich daran zu erinnern, dass es (bei Oracle) einen Unterschied gibt zwischen Äußern select count(*) from any_tableund select count(any_non_null_column) from any_table.

Was sind die Unterschiede zwischen diesen beiden Aussagen, falls vorhanden?

Martin
quelle

Antworten:

72
  • COUNT (*) enthält NULL
  • COUNT (column_or_expression) wird nicht.

Das bedeutet , COUNT(any_non_null_column)die gleiche wie geben COUNT(*)natürlich , weil es keine NULL - Werte sind Unterschiede zu verursachen.

Im Allgemeinen COUNT(*)sollte es besser sein, da jeder Index verwendet werden kann, da er COUNT(column_or_expression)möglicherweise nicht indiziert oder SARGable ist

Aus ANSI-92 (suchen Sie nach " Scalar expressions 125")

Fall:

a) Wenn COUNT (*) angegeben ist, ist das Ergebnis die Kardinalität von T.

b) Ansonsten sei TX die einspaltige Tabelle, die das Ergebnis der Anwendung des <Werteausdrucks> auf jede Zeile von T und der Eliminierung von Nullwerten ist. Wenn ein oder mehrere Nullwerte beseitigt werden, wird eine Beendigungsbedingung ausgelöst: Warnung - Nullwert beseitigt in eingestellter Funktion.

Die gleichen Regeln gelten zumindest auch für SQL Server und Sybase

Hinweis: COUNT (1) ist dasselbe wie COUNT (*), da 1 ein nicht nullwertfähiger Ausdruck ist.

gbn
quelle
4
Der Vollständigkeit halber: Oracle verwendet einen Index-Scan für eine indizierte Nicht-Null-Spalte, falls count(*)verwendet.
a_horse_with_no_name
Ich dachte, die drei möglichen Optionen wären COUNT(*), COUNT(<constant>)und COUNT(<column name>)dass allen drei das Präfix ALLoder vorangestellt werden könnte DISTINCT(standardmäßig, ALLwenn weggelassen). Ich frage mich nur, welcher Ausdruck verwendet werden kann, wo Sie sagen _or_expression?
Tag, wenn
2
@onedaywenn COUNT(1)als unbrauchbares Beispiel, ist es das gleiche wie COUNT(*). COUNT(CASE WHEN a>b THEN 1 END)Als Beispiel für die Zählung von Zeilen mit a> b.
Ypercubeᵀᴹ
16

In jeder neueren (dh 8.x + ) Version von Oracle machen sie dasselbe . Mit anderen Worten, der einzige Unterschied ist die Semantik:

select count(*) from any_table

ist leicht lesbar und offensichtlich, was Sie zu tun versuchen, und

select count(any_non_null_column) from any_table

ist schwerer zu lesen, weil

  1. es ist länger
  2. es ist weniger erkennbar
  3. man muss sich überlegen, ob das any_non_null_columnwirklich so durchgesetzt wirdnot null

Kurz gesagt, verwenden Siecount(*)

Jack Douglas
quelle
9

In einer neueren Version gibt es in der Tat keinen Unterschied zwischen count (*) und count ( keine Nicht-Null-Spalte ), wobei not null hervorzuheben ist :-) Habe dieses Thema übrigens mit einem Blog-Beitrag behandelt: Ist count (col) besser als count? (*)?

Uwe Hesse
quelle
1

Im Handbuch Oracle8i Certified Professional - Handbuch zur DBA-Zertifizierungsprüfung (ISBN 0072130601) , Seite 78, heißt es, dass COUNT (1) tatsächlich schneller ausgeführt wird als COUNT (*), da bestimmte Mechanismen zum Überprüfen des Datenwörterbuchs auf die Nullbarkeit jeder Spalte (oder) aufgerufen werden mindestens die erste Spalte mit Nichtnullierbarkeit) bei Verwendung von COUNT (*) . COUNT (1) umgeht diese Mechanismen.

MySQL-Cheats für 'SELECT COUNT (1) on tblname;' auf MyISAM-Tabellen, indem Sie den Tabellenkopf für die Tabellenzahl lesen. InnoDB zählt jedes Mal.

Um zu testen, ob COUNT (1) datenbankunabhängig schneller als COUNT (*) ausgeführt wird, führen Sie einfach Folgendes aus und beurteilen Sie die Laufzeit selbst:

SELECT COUNT(1) FROM tblname WHERE 1 = 1;
SELECT COUNT(*) FROM tblname WHERE 1 = 1;
SELECT COUNT(column-name) FROM tblname WHERE 1 = 1;

Dadurch wird die COUNT-Funktion unabhängig von der Speicher-Engine oder dem RDBMS auf dem gleichen Niveau ausgeführt.

RolandoMySQLDBA
quelle
8
Der Prüfungsleitfaden ist falsch. In Oracle count (*) = count (1) (mindestens nach Version 7). Siehe asktom.oracle.com/pls/asktom/… (bereits von @JackPDouglas referenziert)
Leigh Riffel
3
Interessant. COUNT (*) sollte keine Spalten gemäß ANSI-Spezifikation prüfen. Wurde vor einiger Zeit auf SO für SQL Server gefragt stackoverflow.com/questions/1221559/count-vs-count1/…
gbn
@gbn, @Leigh Riffel, @bernd_k Vielen Dank, dass Sie sich an mich gewandt haben und mich daran erinnert haben, mehr zu lesen und zu lernen, vor allem, weil ich eine Weile nicht mehr mit Oracle gearbeitet habe.
RolandoMySQLDBA