2008-09-12 4 views

Antwort

13

Zu sagen, dass SELECT COUNT(*) vs COUNT(1) Ergebnisse in Ihrem DBMS Rückkehr " Säulen "ist reine Koje. Das kann lange der Fall gewesen sein, vor langer Zeit, aber jeder sich selbst achtet Abfrageoptimierer eine schnelle Methode wählen, um die Zeilen in der Tabelle zu zählen - es NO Performance-Unterschied zwischen SELECT COUNT(*), COUNT(1), COUNT('this is a silly conversation')

Außerdem ist, wird SELECT(1) vs SELECT(*) NICHT einen Unterschied in der INDEX-Nutzung haben - die meisten DBMS werden sowieso SELECT(n) into SELECT(*) optimieren. Siehe die TOM ASK: Oracle wurde SELECT(n) into SELECT(*) für den besseren Teil von einem Jahrzehnt zu optimieren, wenn sie nicht mehr: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1156151916789

Problem ist in count (col) zu zählen () Umwandlung ** 03/23/00 05:46 pm *** Eine Problemumgehung besteht darin, das Ereignis 10122 auf zu setzen. Count (col) ausschalten -> count () Optimierung.Eine andere Arbeit herum ist , um die Zählung zu ändern, um zu zählen (), es bedeutet das selbe, wenn die Spalte eine NOT NULL Beschränkung hat. Die Fehlernummer ist 1215372.

Eine Sache zu beachten - wenn Sie COUNT verwenden (col) (! Nicht) und col markierte NULL, dann wird es tatsächlich die Anzahl der Vorkommen zählen in die Tabelle (entweder über Index-Scan, Histogramm usw., falls sie vorhanden sind, oder andernfalls eine vollständige Tabellensuche).

Fazit: wenn das, was Sie wollen, ist die Anzahl der Zeilen in einer Tabelle, die Verwendung COUNT (*)

+0

Es ist nicht richtig zu sagen, dass es keinen Unterschied zwischen Auswahl (n) und Auswahl (*) gibt. Wenn Sie einen Deckungsindex haben, der n enthält, erhalten Sie die Daten direkt von der Blattebene des Index und müssen nicht zurück zur Tabelle, die viel schneller ist. –

+1

Der DBMS-Optimierer * erkennt dies * und wählt den richtigen Index für den Job. Vorausgesetzt, es gibt einen Index, selten ist der Tag, an dem ich ein DBMS tatsächlich gesehen habe ** zählen ** Zeilen auf dem Tisch. Außerdem führt das Vorhandensein von NULLs oft zu semantischen Fehlern. Wenn Sie die Anzahl der Zeilen in einer Tabelle haben möchten, verwenden Sie COUNT (*) !!! –

5

ich das man glauben beantwortet wurde in: In SQL, what's the difference between count(column) and count(*)?

+0

Das ist sehr ähnlich (und kann in der Tat die gleiche Antwort sein), aber ich frage mich, ob es einen Unterschied zwischen Referenzieren einer bestimmten Spalte (COUNT (Spalte)) im Vergleich zu einer beliebigen Zeichenfolge (COUNT ('x')). – Andrew

3

Der große Unterschied in der Leistung ist, dass COUNT (*) auf durch die Untersuchung der Primärschlüssel erfüllt werden Der Tisch.

, d.h. im folgenden einfachen Fall wird die Abfrage sofort zurückkehren, ohne dass irgendwelche Zeilen untersucht werden müssen.

select count(*) from table 

Ich bin nicht sicher, so dass, wenn der Abfrageoptimierer in SQL Server tun, aber in dem obigen Beispiel, wenn die Spalte, auf den Sie die Gruppierung einen Index hat, soll der Server in der Lage sein, um die Abfrage zu erfüllen, ohne auf die eigentliche Tabelle überhaupt.

Um zu verdeutlichen: Diese Antwort bezieht sich speziell auf SQL Server. Ich weiß nicht, wie andere DBMS-Produkte damit umgehen.

3

Diese Frage ist etwas anders als die anderen verwiesen. In der referenzierten Frage wurde gefragt, was der Unterschied bei der Verwendung von count (*) und count (SomeColumnName) war, und SQLMenace's answer war genau richtig.

Um diese Frage zu beantworten, gibt es im Wesentlichen keinen Unterschied im Ergebnis. Sowohl count (*) als auch count ('x') und say count (1) geben die gleiche Zahl zurück. Der Unterschied besteht darin, dass bei Verwendung von "*" genau wie in einem SELECT alle Spalten zurückgegeben und dann gezählt werden. Wenn eine Konstante verwendet wird (z. B. 'x' oder 1), wird eine Zeile mit einer Spalte zurückgegeben und dann gezählt. Der Leistungsunterschied wäre zu sehen, wenn "*" viele Spalten zurückgibt.

aktualisieren: Die obige Aussage über die Leistung ist wahrscheinlich nicht ganz richtig, wie in anderen Antworten diskutiert, aber gilt Abfragen Unterauswahl, wenn EXISTS verwenden und VORHANDEN NICHT

+0

Bedeutet das, dass COUNT ('x') schneller wäre, wenn die Tabelle viele Spalten hätte, verglichen mit COUNT (*)? – Andrew

+0

Ich denke, dieses Verhalten hängt von der Datenbank und der angewandten Abfrageoptimierung ab. Es ist eine offensichtliche Optimierung, wenn COUNT (*) angezeigt wird. Es kann nur eine Sache bedeuten, Sie wollen die Gesamtzahl der Zeilen, unabhängig davon, wie viele Spalten die Tabelle hat. – Brannon

Verwandte Themen