Nejlepší odpověď
Zde již existují dobré odpovědi, ale bohužel některé se mýlí.
1 v COUNT (1) je jen doslovný konstantní výraz, nemá nic společného se sloupcem 1 tabulky. Poskytne stejnou odpověď jako COUNT (*) a má stejný plán provedení. Dotaz bude počítat řádky v nejmenším nekupovaném indexu, aby se minimalizovalo požadované I / O.
COUNT (Col) (pro sloupec s možnou hodnotou Null) bude nalezen počítáním řádků v nejmenším indexu, který zahrnuje Col, pokud není v žádném indexu, je vyžadován sken tabulky. Pokud je Col v seskupeném klíči nebo indexu, je také součástí každého jiného indexu, takže bude skenován nejmenší nehrnutý index, spíše než sken seskupené tabulky.
Pokud cílený sloupec NENÍ NULL, pak COUNT (Col) je identický s COUNT (*) a bude znovu nalezen skenováním nejmenšího nekupovaného indexu, i když Col není v žádném indexu.
Tyto příkazy jsou založeny na odhadovaných plánech provádění různých dotazů na server SQL 2014, mohou optimalizátory dotazů pro starší nebo novější verze fungovat odlišně. Možná zjistíte, že naučení se číst plány provádění vás může naučit mnohem víc o tom, jak se dotazy provádějí, než snažit se zjistit, která odpověď zde zveřejněná je přesnější.
Odpověď
Parametr funkce COUNT je výraz, který se má vyhodnotit pro každý řádek. Funkce COUNT vrací počet řádků, pro které je výraz vyhodnocen, na jinou hodnotu než null. (* je speciální výraz, který se nevyhodnocuje, jednoduše vrátí počet řádků.)
Existují dva další modifikátory výrazu: ALL a DISTINCT. Ty určují, zda jsou duplikáty zahozeny. Protože ALL je výchozí hodnota, váš příklad je stejný jako count (ALL 1), což znamená, že jsou zachovány duplikáty.
Protože výraz „1“ je pro každý řádek vyhodnocen jako nenulový a protože neodstraňují duplikáty, COUNT (1) by měl vždy vrátit stejné číslo jako COUNT (*).