I have a SQL table BookChapters with over 20 millions rows. It has a clustered primary key (bookChapterID) and doesn’t have any other keys or indexes. It takes miliseconds to run the following query
if (select count(*) from BookChapters) = 0
...
However, it takes over 10 minutes when I change it like so
if (select count(*) from BookChapters) = 1
...
or
if (select count(*) from BookChapters) > 1
...
Why is that?
How can I get select count(*) to execute faster?
Mikael Eriksson has a good explanation bellow why the first query is fast:
SQL server optimize it into:
if exists(select * from BookChapters). So it goes looking for the presence of one row instead of counting all the rows in the table.For the other two queries, SQL Server would use the following rule. To perform a query like
SELECT COUNT(*), SQL Server will use the narrowestnon-clustered index to count the rows. If the table does not have any
non-clustered index, it will have to scan the table.
Also, if your table has a clustered index you can get your count even faster using the following query (borrowed from this site Get Row Counts Fast!)
It uses sysindexes system table. More info you can find here SQL Server.
Here is another link Why is my SELECT COUNT(*) running so slow? with another solution. It shows technique that Microsoft uses to quickly display the number of rows when you right click on the table and select properties.
You should find that this returns very quickly no matter how many tables you have.
If you are using SQL 2000, you can use the sysindexes table to get the number.
This number may be slightly off depending on how often SQL updates the sysindexes table, but it’s usually correct (or at least close enough).