Ich scheine mich zu erinnern, dass es (unter Oracle) einen Unterschied zwischen dem Aussprechen von select count(*) from any_table
und select count(any_non_null_column) from any_table
gibt.
Was sind die Unterschiede zwischen diesen beiden Aussagen, falls vorhanden?
Dies bedeutet, dass COUNT(any_non_null_column)
natürlich dasselbe wie COUNT(*)
ergibt, da es keine NULL-Werte gibt, die Unterschiede verursachen könnten.
Im Allgemeinen sollte COUNT(*)
besser sein, da jeder Index verwendet werden kann, da COUNT(column_or_expression)
möglicherweise nicht indiziert oder SARGable ist
Von ANSI-92 (suchen Sie nach "Scalar expressions 125
")
Fall:
a) Wenn COUNT (*) angegeben ist, ist das Ergebnis die Kardinalität von T.
b) Andernfalls sei TX die einspaltige Tabelle, die das Ergebnis der Anwendung des <Wertausdrucks> auf jede Zeile von T und der Eliminierung von Nullwerten ist. Wenn ein oder mehrere Nullwerte eliminiert werden, wird eine Abschlussbedingung ausgelöst: Warnung - Nullwert in der eingestellten Funktion eliminiert.
Die gleichen Regeln gelten zumindest auch für SQL Server und Sybase
Hinweis: COUNT (1) ist dasselbe wie COUNT (*), da 1 ein nicht nullbarer Ausdruck ist.
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 versuchen, und
select count(any_non_null_column) from any_table
ist schwerer zu lesen, weil
any_non_null_column
wirklich als not null
erzwungen wird.Kurz gesagt, benutze count(*)
In einer neueren Version gibt es in der Tat keinen Unterschied zwischen count (*) und count ( jede nicht null Spalte), wobei die Betonung auf nicht null :-) Habe dieses Thema übrigens mit einem Blogbeitrag behandelt: Ist count (col) besser als count (*)?
In dem Buch Oracle8i Certified Professional DBA-Zertifizierungsprüfungshandbuch (ISBN 0072130601) heißt es auf Seite 78, dass COUNT (1) tatsächlich schneller ausgeführt wird als COUNT (*) weil bei Verwendung von COUNT (*) bestimmte Mechanismen zum Überprüfen des Datenwörterbuchs auf die Nullfähigkeit jeder Spalte (oder zumindest der ersten Spalte mit Nicht-Nullfähigkeit) aufgerufen werden. . COUNT (1) umgeht diese Mechanismen.
MySQL-Cheats für 'SELECT COUNT (1) on tblname;' in MyISAM-Tabellen durch Lesen des Tabellenkopfs für die Tabellenanzahl. 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 arbeitet die COUNT-Funktion unabhängig von der Speicher-Engine oder dem RDBMS auf gleichen Wettbewerbsbedingungen.