2016-06-28 10 views

답변

7

특별 계획과 준비 계획의 차이점은 무엇입니까?

애드혹 쿼리

select * from t1 

준비 쿼리 실제 값 대신 대체 위치에 홀더가 준비된 문이라고
를 조회합니다.

몇 가지 예 :

select * from t1 where [email protected] 

또 하나의 예는 위키 피 디아에서 촬영 : SQL 서버 계획 캐시를 최적화 할 때

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

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

나는 그것에 대해 알아야 할 사항은 무엇입니까? 내가 조금 그것을 유지하려고합니다 cache.so 계획을 최적화하는 방법에 대해 설명 백서가 있습니다

는 .. 쿼리가 SQL에 대해 실행됩니다 일반적으로

, SQL은 계획의 계획 저장을 컴파일 캐시는 .. 계획 캐시 메모리 버퍼 풀에서 가져 다른 버전 당신은 메모리가 하드웨어 아무리 당신이 누출이있는 경우 충분하지 않습니다 귀중한 자원 및 것을 알고 how much amount of memory will be used

에 다른 제한이 .This

당신이 한 번 또는 두 번 쿼리를 제출 가정이이 lot.SQL는 일반적으로 나쁜 PlanCache을 bloats 계획 캐시에서이 쿼리의 계획을 저장합니다 쿼리와 같이 제출하는 경향이

도움이 될 것입니다 다른 DMV에 있습니다

계획 캐시를 파고 들었다.

쿼리 객체의 다른 유형을 찾을 계획 캐시에 있습니다

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

애드혹은 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 

으로 bloating 계획 캐시 인 명령문 삭제 :

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

참조 된 문서 위의 경우 kimberely Adhoc 작업 부하 최적화 옵션을 사용하도록 제안하지만 먼저 테스트 해보십시오. interesting thread은 DBA.SE에 있습니다.

+0

감사합니다. 당신이 임시로 플랜케이크를 부풀리기 시작 했으므로 한 번만 사용되는 계획을 준비했습니다. SQL Server는 임시 워크로드에 대해 최적화 옵션을 제공합니다. 옵션을 1로 설정하면 데이터베이스 엔진은 처음 실행시 전체 계획이 아닌 계획 캐시에 작은 컴파일 된 계획 스텁 만 저장합니다. – r0tt

+0

좋은 옵션, 임시 작업 최적화 옵션의 일부 스레드 링크에 대한 업데이트 된 답변보기 – TheGameiswar