26 Dec

Difference between COUNT (1), COUNT (*) and COUNT(COLUMN_NAME)

COUNT () is a function in SQL Server counts the number of rows. This method accepts only on parameter.  Though it is a simple function, it creates a bit confusion based on the parameters (*, 1 and COLUM_NAME).

You might have seen the COUNT () function has been used in the below formats

COUNT (1)

COUNT (*)

COUNT(COLUMN_NAME)

COUNT(DISTINCT(COLUMN_NAME)

To demonstrate these differences, let us create a table as below

CREATE  TABLE [dbo].[TestCount]
(
 ID INT,
 [FirstName] VARCHAR(100)
)

Then execute the below script to insert 1300000 records

DECLARE @i INT =1

set nocount on;
WHILE(@i <=1300000)
BEGIN

INSERT INTO TestCount (Id,FirstName)
VALUES (@i,'Test -'+CAST(@i as VARCHAR(100)))
 set @i+=1;
END

Let us go ahead and execute the below query

select count(*) from TestCount

If we look at the execution plan, we can see that it that was a Table scan

Now let us go ahead and create a Primary Key constraint on this table. To Create a primary key, we need to alter the column “ID” to set it as non-nullable.

Execute the below script

ALTER TABLE TestCount
ALTER COLUMN ID INT NOT NULL;

Then execute the below script

ALTER TABLE TestCount
ADD CONSTRAINT PK_TestCount PRIMARY KEY (ID);

Now execute the below query and see the execution plan

select count(*) from TestCount

Now the scan become Clustered Index scan.

Now let us go ahead and execute the below script

select count(1) from TestCount

Still, we can see that Clustered Index scan on Execution Plan

Now execute below query and see the Execution plan

select count(FirstName) from TestCount

Still, we can see that the Clustered Index scan has been performed.

Now let us go ahead and create a non-clustered index as below

CREATE NONCLUSTERED INDEX IX_TestCount_FirstName
ON TestCount(FirstName)

Then execute the below query and see the execution plan

select count(FirstName) from TestCount

This time, Index scan has been performed and the non-clustered index has been considered. If you try to execute Count (*) or Count (1) or Count (ID), we will get the same execution plan with non-clustered index scan. I leave these executions to you to check

About the Author

Comments are closed.