Immer wieder kann man die Datenbank Communities die Behauptung lesen, dass ein SELECT (1) schneller sein soll als ein SELECT COUNT(*).
...und immer wieder muss man dem entgegenhalten, dass dies - zumindest für SQL Server - nicht stimmt. Ich kenne mich zwar nicht so mit vielen anderen Datenbank Plattformen aus, würde aber argumentieren, dass es ein Bug im Optimierer wäre, wenn es einen Unterschied machen sollte und dass dieser Bug schnellstens gefixed werden würde.
Wie gesagt, für SQL Server gibt es KEINEN Unterschied zwischen beiden Varianten. Ein Blick in die SQL Server Books Online zu COUNT zeigt folgendes:
COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )
und etwas weiter unten
* Gibt an, dass alle Zeilen gezählt werden müssen, um die Gesamtzahl der Zeilen einer Tabelle zurückzugeben. COUNT(*) besitzt keine Parameter und kann nicht zusammen mit DISTINCT verwendet werden. COUNT(*) erfordert keinen expression-Parameter, da definitionsgemäß keine Informationen zu einer bestimmten Spalte verwendet werden. COUNT(*) gibt die Anzahl von Zeilen in der angegebenen Tabelle zurück, ohne Duplikate zu entfernen. Dabei werden alle Zeilen einzeln gezählt. Dies gilt auch für Zeilen, die NULL-Werte enthalten.
Das heisst, dass SQL Server nicht zu den Metadaten gehen muss, um Informationen zu Spalten usw. abzufragen, da bekannt ist, dass dieses * im Kontext eines COUNTs aufgerufen wird und deshalb Spalteninformationen nicht von Interesse sind. Daher wäre es eine offensichtliche Verschwendung von Resourcen, Informationen abzufragen, die niemand benötigt. Die 1 in COUNT(1) ist "nur" ein Ausdruck, der identisch zu * interpretiert wird, da der Ausdruck 1 nie NULL ist.
Selbst gesetzt den Fall, dass Metadaten abgefragt werden sollten, würde dies vor der eigentlichen Ausführungsphase erfolgen und hätte damit nur einen Effekt auf die Kompilier-/Optimier-Phase. Die eigentliche Ausführungsphase hingegen ist in beiden Fällen absolut identisch. Gleicher Ausführungsplan, gleicher IO, gleiches alles.
Hier einige der vielen Diskussionen zu diesem Thema:
http://stackoverflow.com/q/1221559/27535
http://social.msdn.microsoft.com/forums/en-US/transactsql/thread/9367c580-087a-4fc1-bf88-91a51a4ee018/
Und hier ein Link zu Oracle, in der Tom Kyte klarstellt, dass es auch für Oracle keinen Unterschied zwischen beiden Varianten gibt:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1156151916789
Man kann sogar Ausdrücke verwenden, die im Regelfall sonst einen Fehler verursachen würden, wie zum Beispiel SELECT COUNT(1/0). Zumindest scheint es solange zu funktionieren, wie kein GROUP BY eingefügt wird. SELECT COUNT(1/0) ... GROUP BY whatever fällt nämlich interessanterweise auf die Nase. :-)