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?
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.
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
es ist länger
es ist weniger erkennbar
man muss sich überlegen, ob das any_non_null_columnwirklich so durchgesetzt wirdnot null
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? (*)?
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:
Der Prüfungsleitfaden ist falsch. In Oracle count (*) = count (1) (mindestens nach Version 7). Siehe asktom.oracle.com/pls/asktom/… (bereits von @JackPDouglas referenziert)
@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.
count(*)
verwendet.COUNT(*)
,COUNT(<constant>)
undCOUNT(<column name>)
dass allen drei das PräfixALL
oder vorangestellt werden könnteDISTINCT
(standardmäßig,ALL
wenn weggelassen). Ich frage mich nur, welcher Ausdruck verwendet werden kann, wo Sie sagen_or_expression
?COUNT(1)
als unbrauchbares Beispiel, ist es das gleiche wieCOUNT(*)
.COUNT(CASE WHEN a>b THEN 1 END)
Als Beispiel für die Zählung von Zeilen mit a> b.In jeder neueren (dh 8.x + ) Version von Oracle machen sie dasselbe . Mit anderen Worten, der einzige Unterschied ist die Semantik:
ist leicht lesbar und offensichtlich, was Sie zu tun versuchen, und
ist schwerer zu lesen, weil
any_non_null_column
wirklich so durchgesetzt wirdnot null
Kurz gesagt, verwenden Sie
count(*)
quelle
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? (*)?
quelle
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:
Dadurch wird die COUNT-Funktion unabhängig von der Speicher-Engine oder dem RDBMS auf dem gleichen Niveau ausgeführt.
quelle