There's a newer version of SQL Server 2008 (Release Candidate 0) available on MSDN and Technet.
There's a couple of features that show up in RC0 that are performance related. One is a server setting 'optimize for ad hoc workloads'. This one tells SQL Server to save a "compiled plan stub" in the query cache for adhoc queries, rather than the query plan that's usually saved.
You can see these stubs as cacheobjtype 'Compiled Plan Stub' in sys.dm_exec_cached_plans. And you can see them because trying to resolve a plan_handle to a query plan (using sys.dm_exec_cached_plans or sys.dm_exec_query_stats) doesn't work for stubs, like it does for "real" plan handles. Saving a stub rather than the entire plan saves precious plan cache memory.
Here's a little script to try it out.
sp_configure 'show advanced options',1
reconfigure
go
sp_configure 'optimize for ad hoc workloads',1
reconfigure
go
— don't use on a production system, clears whole query cache
DBCC FREEPROCCACHE
go
use pubs
go
— background plans to produce this DMV, note there is a stub for one of these plans
select * from sys.dm_exec_cached_plans
go
— not autoparameterized, stub produced
SELECT title_id, sum(qty) from sales
group by title_id
having sum(qty) = 30
go
— you can see the stub
select * from sys.dm_exec_cached_plans
go
— autoparameterized, whole query plan for parameterized version
SELECT *
FROM titles
WHERE price = 19.99
go
— stub for the non-parameterized version, plan for the parameterized version
SELECT usecounts, cacheobjtype, objtype, [text]
FROM sys.dm_exec_cached_plans P
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
WHERE [text] NOT LIKE '%dm_exec%'
ORDER BY p.usecounts DESC
— query plan for stub query handle is not saved returns NULL
SELECT sql.text, p.query_plan
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(sql_handle) sql
CROSS APPLY sys.dm_exec_query_plan(plan_handle) p
WHERE text NOT LIKE '%sys_dm_exec%' AND text NOT LIKE '%msparam_0%'
ORDER BY qs.EXECUTION_COUNT DESC
go
— set it back, same experiment produces plans not stubs
sp_configure 'show advanced options',1
reconfigure
go
sp_configure 'optimize for ad hoc workloads',0
reconfigure
go
One thought on “Performance features in SQL Server 2008 RC0 – Optimize for Adhoc Workloads”
Do you know if this changes the behaviour of the TokenAndPermUserStore? Currently I;m finding that’s a lot more of a bottleneck with adhoc code than the plan cache.
I did an investigation on the growth of that cache on 2 of my servers that have lots of adhoc code and the results were scary. See – http://sqlinthewild.co.za/index.php/2008/05/02/token-and-perm-user-store-growth/
Comments are closed.