Ich arbeite im SQL Server-Team und kann hoffentlich einige Punkte in diesem Thread klären (ich hatte es zuvor noch nicht gesehen, es tut mir leid, dass das Engineering-Team dies zuvor noch nicht getan hat).
Erstens gibt es keinen semantischen Unterschied zwischen select count(1) from table
vs. select count(*) from table
. Sie geben in allen Fällen die gleichen Ergebnisse zurück (und es ist ein Fehler, wenn nicht). Wie in den anderen Antworten angegeben, select count(column) from table
ist semantisch unterschiedlich und liefert nicht immer die gleichen Ergebnisse wie count(*)
.
Zweitens gibt es in Bezug auf die Leistung zwei Aspekte, die in SQL Server (und SQL Azure) von Bedeutung sind: Kompilierungszeitarbeit und Ausführungszeitarbeit. Die Kompilierungszeit ist eine trivial kleine Menge zusätzlicher Arbeit in der aktuellen Implementierung. In einigen Fällen wird das * auf alle Spalten erweitert, gefolgt von einer Reduzierung auf 1 Spalte, die ausgegeben wird, da einige der internen Operationen beim Binden und Optimieren funktionieren. Ich bezweifle, dass es in einem messbaren Test auftauchen würde, und es würde wahrscheinlich im Rauschen all der anderen Dinge verloren gehen, die unter der Decke passieren (wie automatische Statistiken, xevent-Sitzungen, Overhead des Abfragespeichers, Trigger usw.). Es sind vielleicht ein paar tausend zusätzliche CPU-Anweisungen. Damit, count (1) erledigt während der Kompilierung ein wenig weniger Arbeit (was normalerweise einmal vorkommt und der Plan über mehrere nachfolgende Ausführungen zwischengespeichert wird). Für die Ausführungszeit sollte es unter der Annahme, dass die Pläne gleich sind, keinen messbaren Unterschied geben. (Eines der früheren Beispiele zeigt einen Unterschied - es ist höchstwahrscheinlich auf andere Faktoren an der Maschine zurückzuführen, wenn der Plan identisch ist).
Wie der Plan möglicherweise anders sein kann. Dies ist äußerst unwahrscheinlich, aber in der Architektur des aktuellen Optimierers möglicherweise möglich. Das Optimierungsprogramm von SQL Server funktioniert als Suchprogramm (denken Sie: Computerprogramm, das Schach spielt und verschiedene Alternativen für verschiedene Teile der Abfrage durchsucht und die Alternativen berechnet, um den günstigsten Plan in angemessener Zeit zu finden). Diese Suche hat einige Einschränkungen hinsichtlich der Funktionsweise, um die Fertigstellung der Abfragekompilierung in angemessener Zeit zu gewährleisten. Für Abfragen, die über das Trivialste hinausgehen, gibt es Phasen der Suche, und sie behandeln Tranchen von Abfragen, basierend darauf, wie kostspielig der Optimierer die Ausführung der Abfrage für möglich hält. Es gibt drei Hauptsuchphasen, und in jeder Phase können aggressivere (teurere) Heuristiken ausgeführt werden, um einen günstigeren Plan als bei jeder früheren Lösung zu finden. Letztendlich gibt es am Ende jeder Phase einen Entscheidungsprozess, der versucht zu bestimmen, ob der bisher gefundene Plan zurückgegeben oder weiter gesucht werden soll. Bei diesem Prozess wird die bisher benötigte Gesamtzeit im Vergleich zu den geschätzten Kosten des besten bisher gefundenen Plans verwendet. Auf verschiedenen Computern mit unterschiedlichen CPU-Geschwindigkeiten ist es daher möglich (wenn auch selten), unterschiedliche Pläne zu erhalten, da in einer früheren Phase mit einem Plan eine Zeitüberschreitung auftritt und nicht in die nächste Suchphase übergegangen wird. Es gibt auch einige ähnliche Szenarien, die sich auf das Auslaufen der letzten Phase und möglicherweise auf den Speicher bei sehr, sehr teuren Abfragen beziehen, die den gesamten Speicher auf dem Computer belegen (normalerweise kein Problem bei 64-Bit, aber es war ein größeres Problem zurück auf 32-Bit-Servern). Wenn Sie einen anderen Plan erhalten, würde sich die Leistung zur Laufzeit letztendlich unterscheiden. Ich nicht
Net-Net: Bitte verwenden Sie eines der beiden gewünschten Elemente, da dies in keiner praktischen Form von Bedeutung ist. (Es gibt weitaus größere Faktoren, die die Leistung in SQL über dieses Thema hinaus ehrlich beeinflussen).
Ich hoffe das hilft. Ich habe ein Buchkapitel über die Funktionsweise des Optimierers geschrieben, aber ich weiß nicht, ob es angemessen ist, es hier zu veröffentlichen (da ich immer noch winzige Lizenzgebühren bekomme, glaube ich). Anstatt zu veröffentlichen, dass ich einen Link zu einem Vortrag bei SQLBits in Großbritannien veröffentlichen werde, in dem es darum geht, wie das Optimierungsprogramm auf hohem Niveau funktioniert, können Sie die verschiedenen Hauptphasen der Suche auf Wunsch etwas detaillierter sehen darüber zu lernen. Hier ist der Videolink: https://sqlbits.com/Sessions/Event6/inside_the_sql_server_query_optimizer