Read-only databases cannot create new statistics
A while back, I was working with Kendra Little (@KendraLittle, blog), and we were using log shipping to make warm standby copies of reporting databases. The warm standby databases were marked as READ_ONLY. However, this meant the query optimization process couldn’t create new statistics (MSDN) when users ran ad-hoc SELECT statements.
Query Plans With Missing Statistics
Using a one-table unit test, we are able to see that a read-only database cannot create stats. The estimating query plan shows a warning symbol, symbolizing that the query optimizer cannot create statistics on necessary columns.
Query Plans With Manually-Created Statistics
Let’s suppose that there are stats on every single column of every single table. Then, the query optimizer can do a better job of producing good plans. Using the query in our one-table unit test now produces a plan without warnings.
MANUALLY CREATED STATISTICS SCRIPT AND TEST
My solution is to manually create statistics on every column where they don’t already exist. Below is an example script and a unit test for it.
Script: Manually-Create-Stats.sql
Unit Test: Manually-Create-Stats-Test.sql
Performance results
The performance results are pretty clear. Using statistics in a simple, one-table unit test creates a slight performance boost. I have seen gains of 10-30% with many reporting queries; the effect of missing statistics as you join more tables together, use larger tables, and use columns for filtering.


