sql >> Databáze >  >> RDS >> Sqlserver

Count(*) vs Count(Id) na serveru SQL 2005

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) .



  1. Jak se dotazovat na primární klíč v oracle 11g

  2. Jak mohu získat návratovou hodnotu ze systémové zprávy SQL Server?

  3. Optimalizace databází MySQL

  4. Jak exportovat tabulku do formátu csv nebo excel