2016-06-28 5 views
3

Я пытаюсь понять содержание кеша плана на сервере sql.В чем разница между специальным и подготовленным запросом в кэше плана сервера sql?

, так что мои вопросы:
1. В чем разница между специальными и подготовленными планами?
2.Что мне знать об этом при попытке оптимизировать кеш-план сервера sql?

ответ

7

В чем разница между специальными и подготовленными планами?

Adhoc запроса:

select * from t1 

Подготовленный запрос:
Запросы, которые замещающие держатели место в месте фактических значений называются Подготовленные заявления.

Некоторые примеры:

select * from t1 where [email protected] 

Еще один пример из википедии:

command.CommandText = "SELECT * FROM users WHERE USERNAME = @username AND ROOM = @room"; 

    command.Parameters.AddWithValue("@username", username); 
    command.Parameters.AddWithValue("@room", room); 

Что я должен знать об этом при попытке оптимизировать кэш планов SQL Server?

Есть официальные документы, написанные о том, как оптимизировать план cache.so я буду стараться держать его немного ..

Обычно при выполнении запроса на SQL, SQL компилирует план и сохраняет его в плане кэш .Эта кэш плана память берется из пула буферов и различные версии имеют различные ограничения на how much amount of memory will be used

вы знаете, что память является ценным ресурсом и никакого количества аппаратных средств будет достаточно, если у вас есть утечки ..

Предположим, вы передаете запросы только один или два раза, и вы, как правило, представить, как это запросов в lot.SQL будет хранить план этого запросов в кэше планов, которые обычно раздувает PlanCache что плохо

Существуют различные DMVs, которые помогут вы в копании по кешу плана ..

запрос, чтобы найти различные типы объектов находятся в кэше плана:

select 
objtype,count(*) as countt,sum(size_in_bytes)*1024.0 as memoryinkb 
from sys.dm_exec_cached_plans a 
group by objtype 

Adhoc, подготовленные запросы, которые вздутие plancache и используются только один раз:

select q.query_hash, 
    q.number_of_entries, 
    t.text as sample_query, 
    p.query_plan as sample_plan 
from (select top 20 query_hash, 
      count(*) as number_of_entries, 
      min(sql_handle) as sample_sql_handle, 
      min(plan_handle) as sample_plan_handle 
     from sys.dm_exec_query_stats 
     group by query_hash 
     having count(*) > 1 
     order by count(*) desc) as q 
    cross apply sys.dm_exec_sql_text(q.sample_sql_handle) as t 
    cross apply sys.dm_exec_query_plan(q.sample_plan_handle) as p 

Для Удалить заявления, которые представляют собой раздутый план:

DECLARE @MB decimal(19,3) 
     , @Count bigint 
     , @StrMB nvarchar(20) 


SELECT @MB = sum(cast((CASE WHEN usecounts = 1 AND objtype IN ('Adhoc', 'Prepared') THEN size_in_bytes ELSE 0 END) as decimal(12,2)))/1024/1024 
     , @Count = sum(CASE WHEN usecounts = 1 AND objtype IN ('Adhoc', 'Prepared') THEN 1 ELSE 0 END) 
     , @StrMB = convert(nvarchar(20), @MB) 
FROM sys.dm_exec_cached_plans 


IF @MB > 10 
     BEGIN 
       DBCC FREESYSTEMCACHE('SQL Plans') 
       RAISERROR ('%s MB was allocated to single-use plan cache. Single-use plans have been cleared.', 10, 1, @StrMB) 
     END 
ELSE 
     BEGIN 
       RAISERROR ('Only %s MB is allocated to single-use plan cache – no need to clear cache now.', 10, 1, @StrMB) 
       — Note: this is only a warning message and not an actual error. 
     END 
go 

выше должно дать вам представление о том, с чего начать, ниже являются должны читать темы и ссылки:

1. http://www.sqlskills.com/blogs/kimberly/category/plan-cache/

2. http://sqlblog.com/blogs/kalen_delaney/archive/2007/11/04/did-you-know-sp2-does-not-limit-the-amount-of-plan-cache-you-can-have.aspx

3. https://technet.microsoft.com/en-us/library/dd672789(v=sql.100).aspx

4. Must read article By SQLCAT on issues customer faced while using Prepare Statements

В статье ссылка s выше, kimberely предлагает параметр «Включить оптимизацию для Adhoc workloads», но я предлагаю протестировать его first.here interesting thread на DBA.SE

+0

Спасибо, отличный ответ. С тех пор, как вы начали разрабатывать вздутие plancache с помощью adhoc и подготовленных планов, которые используются только один раз. SQL Server предлагает оптимизацию для специальных рабочих нагрузок. Установив параметр 1, при первом выполнении механизм базы данных хранит только небольшой скомпилированный планку плана в кеше плана, а не полный план. – r0tt

+0

thats nice option, см. Мой обновленный ответ для ссылки некоторых потоков для параметра Оптимизация для adhoc workloads – TheGameiswar