it-swarm.com.de

Was ist der Unterschied zwischen Auswahlanzahl (*) und Auswahlanzahl (any_non_null_column)?

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?

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

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.

72
gbn

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

  1. es ist länger
  2. es ist weniger erkennbar
  3. sie müssen darüber nachdenken, ob 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 (*)?

9
Uwe Hesse

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.

1
RolandoMySQLDBA