cancel
Showing results for 
Search instead for 
Did you mean: 

Sql COUNT Performance Question

Former Member
4,964

Structure of Example table:

Id, Integer (PK)
Name, Varchar(100)
Description, Text

I need to know if exists difference in performance between:

SELECT COUNT(*) FROM Example;

and

SELECT COUNT(Id) FROM Example;

Or does not exists differences?

Accepted Solutions (1)

Accepted Solutions (1)

Former Member

My vote: no diff!
In old database servers, count(Id) or count(1) was faster than count(*).

Answers (2)

Answers (2)

Former Member

In version 10.0 and above, COUNT( x ) is translated to COUNT(*) if x is an expression that is known to not allow NULL. In your example, I think you have Id as a primary key (non-NULL), and therefore COUNT(Id) is treated identically to COUNT(*) unless your Example table appears on the NULL-supplying side of an outer join.

For expressions Y that might be NULL, there are at least three ways that COUNT(Y) may be slower than COUNT(*):

  1. The expression Y needs to be computed. This means it must be fetched from the table if it is a column; if it is a more complex expression, it needs to be evaluated to determine if it is NULL. If the COUNT(Y) appears above a work table, the server may need to materialize Y in the work table so that it would be available at the group-by node.
  2. The server can not combine COUNT(Y1) and COUNT(Y2) for different expressions, and materialized views can not be used unless they have an appropriate COUNT(Y) that matches the query.
  3. The server can not perform semantic transformations that eliminate a table needed to compute Y. This also means that index-only retrieval is not possible if Y can not be recovered from the index.

I do not know of any reason why COUNT(Y) might be faster than COUNT(*). So, use COUNT(*) if you want to count rows, and COUNT(Y) if you really need to distinguish how many rows had a NULL value for Y.

MCMartin
Participant

If the exact value is not important, but you just want to get an idea if 1000 or 1Mio entries exists you can use the super fast access to the column count of systab. This value is updated during each successful checkpoint.

select count from systab where table_name = 'Example'

Use case is for instance: The application wants to display total count of customers in the database in its status bar, updated every 5min...

VolkerBarth
Contributor
0 Kudos

@Breck: I wanted to correct "tabel_name", too, but seems unable to. Why don't I have an "edit" button for other people's post - am I still missing reputation in these times of boot-strapping?