Thilo přesně vystihl rozdíl... COUNT( column_name )
může vrátit nižší číslo než COUNT( * )
if column_name
může být NULL
.
Pokud však mohu odpovědět na vaši otázku z trochu jiného úhlu, protože se zdá, že se zaměřujete na výkon.
Nejprve si všimněte, že vydání SELECT COUNT(*) FROM table;
bude potenciálně blokovat spisovatele a bude také blokován ostatními čtenáři/zapisovateli, pokud nezměníte úroveň izolace (kolenní škubnutí má tendenci být WITH (NOLOCK)
ale vidím, že slibný počet lidí konečně začíná věřit v RCSI). Což znamená, že zatímco čtete data, abyste získali svůj „přesný“ počet, všechny tyto požadavky DML se hromadí, a když konečně uvolníte všechny své zámky, otevřou se stavidla, spousta vložení/aktualizace/smazání dojde k aktivitě a dojde k vašemu „přesnému“ počítání.
Pokud potřebujete absolutně transačně konzistentní a přesný počet řádků (i když je platný pouze po dobu milisekund, kterou vám vrátí číslo), pak SELECT COUNT( * )
je vaše jediná volba.
Na druhou stranu, pokud se snažíte získat 99,9% přesný ballpark, budete na tom mnohem lépe s dotazem jako je tento:
SELECT row_count = SUM(row_count)
FROM sys.dm_db_partition_stats
WHERE [object_id] = OBJECT_ID('dbo.Table')
AND index_id IN (0,1);
(SUM
existuje pro zohlednění dělených tabulek – pokud dělení tabulek nepoužíváte, můžete je vynechat.)
Tento DMV udržuje přesné počty řádků pro tabulky s výjimkou řádků, které se aktuálně účastní transakcí – a právě tyto transakce vám umožní SELECT COUNT
dotaz čekejte (a nakonec jej zpřehledněte, než si ho stihnete přečíst). Ale jinak to povede k mnohem rychlejší odpovědi než na vámi navrhovaný dotaz a ne méně přesné než použití WITH (NOLOCK)
.