What are statistics in SQL Server?
SQL statistics are like Google Maps guiding you to your destination.
SQL stats show SQL Server where data lives in the table and how to locate it. The Query Optimizer then uses these stats to create efficient query plans, similar to a Google Map for data access. If the “map” is outdated, you’ll still reach your data, but it may take significantly longer.
It’s the same with SQL Statistics—if they’re outdated, your queries will run slower. One way to resolve this is to:
Enable the “statistics auto-update” option
Best practice to have this setting set to ON.
SQL Server generally does a solid job of updating necessary stats, especially if there aren’t custom maintenance plans in place.
It’s rare to find cases where turning this setting OFF is beneficial, but it can be useful for write-heavy workloads where the latest stats aren’t essential. However, since write-heavy workloads are uncommon, this likely doesn’t apply to you.
To check that “Auto Update Statistics” is ON, here’s what I do:
- Open SSMS
- Right-click on the database name
- Choose Properties
- Go to the Options tab
- Set the Auto Update Statistics property to “True.”

AUTO_UPDATE_STATISTICS_ASYNC option
Enable the AUTO_UPDATE_STATISTICS_ASYNC option if your application frequently runs the same or similar queries with cached query plans. This setting is generally recommended for online transaction processing (OLTP) environments and is less useful for data warehouse systems.
And one more thing. Look out for:
User-created statistics
If user-created statistics are present, especially in large numbers or for complex data, it may signal that someone unfamiliar with best practices has made adjustments. It’s uncommon for even experienced DBAs to add stats manually, as these additions can slow performance, particularly during the Update Statistics process.
Determine the reason for adding user-created stats—removing them is often the best approach.
Here’s a query I run on each database to script out all user-created statistics, allowing you to manually choose which stats to drop.
SELECT DISTINCT 'DROP STATISTICS ' + SCHEMA_NAME(ob.Schema_id) + '.' + OBJECT_NAME(s.object_id) + '.' + s.name DropStatisticsStatement
FROM sys.stats s
INNER JOIN sys.Objects ob ON ob.Object_id = s.object_id
WHERE SCHEMA_NAME(ob.Schema_id) <> 'sys'
AND Auto_Created = 0
AND User_Created = 1