Beste Antwort
Hier gibt es bereits einige gute Antworten, aber Leider sind einige falsch.
Die 1 in COUNT (1) ist nur ein wörtlicher konstanter Ausdruck und hat nichts mit Spalte 1 der Tabelle zu tun. Es gibt die gleiche Antwort wie COUNT (*) und hat den gleichen Ausführungsplan. Die Abfrage zählt die Zeilen im kleinsten nicht gruppierten Index, um die erforderliche E / A zu minimieren.
COUNT (Col) (für eine nullfähige Spalte) wird gefunden, indem die Zeilen im kleinsten Index gezählt werden, der Col enthält. Wenn es sich nicht in einem Index befindet, ist ein Tabellenscan erforderlich. Wenn sich Col im Clustered Key oder Index befindet, ist es auch Teil jedes anderen Index, sodass der kleinste nicht gruppierte Index anstelle eines Clustered Table Scans gescannt wird.
Wenn die Zielspalte NICHT NULL ist, dann COUNT (Col) ist identisch mit COUNT (*) und wird erneut durch Scannen des kleinsten nicht gruppierten Index gefunden, auch wenn Col in keinem Index enthalten ist.
Diese Anweisungen basieren auf geschätzten Ausführungsplänen verschiedener Abfragen für Bei einem SQL 2014-Server funktionieren die Abfrageoptimierer für ältere oder neuere Versionen möglicherweise anders. Möglicherweise lernen Sie beim Lesen von Ausführungsplänen viel mehr darüber, wie Abfragen ausgeführt werden, als herauszufinden, welche Antwort hier genauer ist.
Antwort
Der Parameter für die COUNT-Funktion ist ein Ausdruck, der für jede Zeile ausgewertet werden soll. Die COUNT-Funktion gibt die Anzahl der Zeilen zurück, für die der Ausdruck einen Wert ungleich Null ergibt. (* ist ein spezieller Ausdruck, der nicht ausgewertet wird. Er gibt lediglich die Anzahl der Zeilen zurück.)
Es gibt zwei zusätzliche Modifikatoren für den Ausdruck: ALL und DISTINCT. Diese bestimmen, ob Duplikate verworfen werden. Da ALL die Standardeinstellung ist, entspricht Ihr Beispiel der Anzahl (ALL 1), was bedeutet, dass Duplikate beibehalten werden.
Da der Ausdruck „1“ für jede Zeile und seit Ihnen als ungleich Null ausgewertet wird Wenn keine Duplikate entfernt werden, sollte COUNT (1) immer dieselbe Nummer wie COUNT (*) zurückgeben.