896 Stimmen

Anzahl(*) vs. Anzahl(1) - SQL Server

Ich frage mich nur, ob jemand von Ihnen die Count(1) en Count(*) und ob es einen spürbaren Unterschied in der Leistung gibt oder ob dies nur eine alte Gewohnheit ist, die aus vergangenen Tagen mitgebracht wurde?

Die spezifische Datenbank ist SQL Server 2005 .

6voto

Dherik Punkte 15172

Es gibt eine Artikel die zeigen, dass die COUNT(1) en Oracle ist nur ein Alias für COUNT(*) , mit einer Nachweis darüber.

Ich werde einige Teile zitieren:

Es gibt einen Teil der Datenbanksoftware, der sich "The Optimizer", der in der offiziellen Dokumentation wie folgt definiert ist "Eingebaute Datenbanksoftware, die den effizientesten Weg zur Ausführung einer Ausführung einer SQL-Anweisung".

Eine der Komponenten des Optimierers wird als "Transformator" bezeichnet, deren Aufgabe es ist, festzustellen, ob es vorteilhaft ist, die ursprüngliche SQL-Anweisung in eine semantisch äquivalente SQL-Anweisung umzuschreiben, die effizienter sein könnte.

Möchten Sie sehen, was der Optimierer macht, wenn Sie eine Abfrage schreiben mit COUNT(1) schreiben?

Bei einem Benutzer mit ALTER SESSION Privileg, können Sie eine tracefile_identifier aktivieren Sie das Tracing des Optimierers und führen Sie die COUNT(1) wählen, wie: SELECT /* test-1 */ COUNT(1) FROM employees; .

Danach müssen Sie die Trace-Dateien lokalisieren, was Sie mit SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Diag Trace'; . Später in der Datei werden Sie finden:

SELECT COUNT(*) “COUNT(1)” FROM “COURSE”.”EMPLOYEES” “EMPLOYEES”

Wie Sie sehen können, ist es nur ein Alias für COUNT(*) .

Eine weitere wichtige Bemerkung: Die COUNT(*) war wirklich schneller vor zwei Jahrzehnten auf Oracle, vor Oracle 7.3:

Count(1) ist seit 7.3 in count(*) umgeschrieben worden, weil Oracle gerne mythische Anweisungen automatisch abstimmt. In früheren Oracle7 musste Oracle (1) für jede Zeile als Funktion auswerten, bevor DETERMINISTIC und NON-DETERMINISTIC existieren.

Vor zwei Jahrzehnten war count(*) also schneller

Bei anderen Datenbanken wie Sql Server sollte dies für jede Datenbank einzeln untersucht werden.

Ich weiß, dass diese Frage spezifisch für Sql Server ist, aber die anderen Fragen auf SO über das gleiche Thema, ohne Erwähnung der Datenbank, wurde geschlossen und als dupliziert von dieser Antwort markiert.

4voto

Lukas Eder Punkte 194234

In allen RDBMS sind die beiden Zählweisen gleichwertig in Bezug auf das Ergebnis, das sie liefern. Was die Leistung angeht, so habe ich in SQL Server keinen Leistungsunterschied festgestellt, aber es ist vielleicht erwähnenswert, dass einige RDBMS, z.B. PostgreSQL 11, haben weniger optimale Implementierungen für COUNT(1) da sie prüfen, ob der Argumentationsausdruck nullbar ist, wie in diesem Beitrag zu sehen ist .

Ich habe einen Leistungsunterschied von 10 % bei der Ausführung von 1 Mio. Zeilen festgestellt:

-- Faster
SELECT COUNT(*) FROM t;

-- 10% slower
SELECT COUNT(1) FROM t;

0voto

Graeme Punkte 1068

COUNT(1) unterscheidet sich nicht wesentlich von COUNT(*), wenn überhaupt. Was die Frage des Zählens von NULLable COLUMNs angeht, so kann man die Unterschiede zwischen COUNT(*) und COUNT(<einige Spalte>)-- einfach demonstrieren.

USE tempdb;
GO

IF OBJECT_ID( N'dbo.Blitzen', N'U') IS NOT NULL DROP TABLE dbo.Blitzen;
GO

CREATE TABLE dbo.Blitzen (ID INT NULL, Somelala CHAR(1) NULL);

INSERT dbo.Blitzen SELECT 1, 'A';
INSERT dbo.Blitzen SELECT NULL, NULL;
INSERT dbo.Blitzen SELECT NULL, 'A';
INSERT dbo.Blitzen SELECT 1, NULL;

SELECT COUNT(*), COUNT(1), COUNT(ID), COUNT(Somelala) FROM dbo.Blitzen;
GO

DROP TABLE dbo.Blitzen;
GO

-2voto

Chris Mack Punkte 5096

Wenn Sie den folgenden Befehl in SQL Server ausführen, werden Sie feststellen, dass COUNT(1) wird bewertet als COUNT(*) sowieso. Es scheint also keinen Unterschied zu geben, und auch, dass COUNT(*) ist der Ausdruck, der dem Abfrageoptimierer am nächsten steht:

SET SHOWPLAN_TEXT ON
GO

SELECT COUNT(1)
FROM <table>
GO

SET SHOWPLAN_TEXT OFF
GO

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X