SQL 201 – Statistics

Microsoft SQL Servers collect statistical information on indexes and column data stored in each database. These statistics are used by the query optimizer to choose the most efficient way to execute your queries. Good statistics hep the optimizer to asses the cost of different query plans, then choose the “best” method to execute your query.

The term cost in this case is the price you pay in terms of time, cpu cycles, file IO, page scans, etc. All of which add up as a cost. The lower the price, the more efficient the query is. The reason I put best in quotes, is some times the statistics aren’t as up to date as they could be, and as a result, your queries will return slower than they really could, and as a result, the optimizer’s idea of best, may not really be the best you could get.

By default, SQL Server 2000 and 2005 have automatic create and update statistics turned on. As it should be, since Microsoft considers this a best practice. I have to say I agree with them. That way you can rely on the server engine to take care of itself, and you wont have to keep up with all the queries your fellow database developers are creating all the time. Plus, your database administrators can concentrate on managing the exceptions, rather than the rules.

In some situations you may need to manually create, update or drop statistics. I’d like to cover how to do that in this article, since you’ll need to know how in order to manage the exceptions.


The following code will allow you to create a statistic on a table or indexed view.

ON tableName | indexedViewName (columnName)

This is the least you’ll have to do to create a statistic. Provide the statistic’s name, the table or view name, and a list of the columns you want to collect statistics on. There are additional variables you can set, but as a 200 level course, I’m not going to dig into that too deeply, check the Books online for more information.


The following will allow you to update a specific statistic for a table or a view.

UPDATE STATISTICS tableName | indexedViewName statisticName |indexName

It’s really that easy, just provide the table name or indexed view name, and then the statistic’s name or an index name. Yes, there are statistics on indexes as well as columns! If you have a poorly performing query, this one can often be the difference between minutes and sub-second response times!


Occasionally, you’ll find you have absolutely no use for a statistic… in those cases, you’ll want to get rid of it, just so that you don’t have to deal with it anymore. To do that… check this out:

DROP STATISTICS tableName.statisticsName | viewName.statisticsName

Just provide the table or view name then dot, then the statistics name. If you’re unfamiliar with dotted notation, please check my archive for information on that… it makes notation pretty simple.

That’s pretty much all you’ll need to get started with statistics. Keep them in mind when you’re trying to debug long running queries. Like I said before, they can be the difference in very slow queries and speedy queries. As usual, if you have any questions, send them in! I’m here to help!

By Shannon Lowder

Shannon Lowder is the Database Engineer you've been looking for! Look no further for expertise in: Business Analysis to gather the business requirements for the database; Database Architecting to design the logical design of the database; Database Development to actually build the objects needed by the business logic; finally, Database Administration to keep the database running in top form, and making sure there is a disaster recovery plan.

Leave a comment

Your email address will not be published. Required fields are marked *