Last time we saw when SQL Server creates statistics and what database properties affects statistics update behavior. Today let’s talk what triggers statistics update and how can it be updated manually.
As we know, statistics is based on the table data. And obviously statistics is outdated when underlying data is changed. As you can guess at this point, SQL Server tracks the number of the modifications in the table and updates statistics when number of the modifications reach the threshold. Let’s see what is the threshold. Of course, auto update statistics needs to be enabled on the database level.
For the regular tables update is triggered when:
- When row count changes from 0 to non-zero
- When table has less than 500 rows and there were more than 500 updates on the leading column of the stats
- When table has more than 500 rows and there were more than 500+20% of the number of rows changes on the leading column of the stat
For the temporary table there is one additional threshold at 6 rows. This behavior can be altered with OPTION (KEEP PLAN) query hint.
As the side note, temporary table variables do not keep statistics. That can produce quite inefficient plans in some cases. On the other hand update statistics on the temporary tables can introduce extensive number of recompilations. If this is the case, it could be fixed with OPTION (KEEPFIXED PLAN) query hint that prevents query recompilations based on statistics update.
Statistics also updates during index rebuild stage. It does not update during index reorganize operation through..
A few more methods:
- UPDATE STATISTICS statement allows you to update either single statistics or all statistics on the table. You can control sampling method there
- sp_updatestats update all statistics in the database
- Statistics update could be done via maintenance plan
As I mentioned before, in most part of the cases default behavior is OK. Although it’s useful to understand how it works internally.