sql >> Database >  >> RDS >> Sqlserver

Count(*) vs Count(Id) in sql server 2005

Thilo wist precies het verschil... COUNT( column_name ) kan een lager getal retourneren dan COUNT( * ) if column_name kan NULL zijn .

Als ik uw vraag echter vanuit een iets andere hoek mag beantwoorden, aangezien u zich lijkt te concentreren op prestaties.

Merk eerst op dat het uitgeven van SELECT COUNT(*) FROM table; zal mogelijk schrijvers blokkeren, en het zal ook worden geblokkeerd door andere lezers/schrijvers, tenzij je het isolatieniveau hebt gewijzigd (kniebeweging is meestal WITH (NOLOCK) maar ik zie een veelbelovend aantal mensen eindelijk beginnen te geloven in RCSI). Wat betekent dat terwijl je de gegevens leest om je "nauwkeurige" telling te krijgen, al deze DML-verzoeken zich opstapelen, en wanneer je eindelijk al je sloten hebt vrijgegeven, de sluizen opengaan, een heleboel invoegen/bijwerken/verwijderen activiteit gebeurt, en daar gaat je "nauwkeurige" telling.

Als u een absoluut transactie-consistente en nauwkeurige rijtelling nodig hebt (zelfs als deze alleen geldig is voor het aantal milliseconden dat nodig is om het aantal naar u terug te sturen), dan SELECT COUNT( * ) is uw enige keuze.

Aan de andere kant, als je probeert een 99,9% nauwkeurige marge te krijgen, ben je veel beter af met een vraag als deze:

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

(De SUM is er om rekening te houden met gepartitioneerde tabellen - als u geen tabelpartitionering gebruikt, kunt u deze weglaten.)

Deze DMV houdt nauwkeurige rijtellingen bij voor tabellen, met uitzondering van rijen die momenteel deelnemen aan transacties - en diezelfde transacties zijn degenen die uw SELECT COUNT zullen maken query wachten (en uiteindelijk onnauwkeurig maken voordat je tijd hebt om het te lezen). Maar anders zal dit leiden tot een veel sneller antwoord dan de vraag die u voorstelt, en niet minder nauwkeurig dan het gebruik van WITH (NOLOCK) .



  1. MySQL:Hoe maak je een trigger die minderjarige werknemers afwijst?

  2. Hoe kan ik meerdere rijen combineren in een door komma's gescheiden lijst in SQL Server 2005?

  3. CURRENT_DATE Functie in Oracle

  4. De beste manier om gelijktijdigheidsproblemen op te lossen