Microsoft SQL Server 내에서 이전 쿼리 계획을 모두 지우려면 어떻게합니까?


12

Microsoft SQL 데이터베이스를 사용하는 즉시 사용 가능한 응용 프로그램이 있습니다. 이 응용 프로그램 내에서 각 보고서에 대한 다양한 선택 기준을 선택하고 선택합니다. 그런 다음이 응용 프로그램은 이러한 보고서를 실행합니다.

쿼리 계획에 문제가 있다고 생각합니다. 우리가 매일 실행하는 첫 번째 보고서는 매우 빠르게 7 분 동안 실행됩니다. 첫 번째 보고서 이후에 실행 된 보고서는 1 시간 이상이 걸립니다.

매일 밤 우리는 SQL Server 에이전트와 SQL Server를 중지하고 시작하는 예약 된 작업을 실행합니다. 이 SQL Server 인스턴스에는 약 25 개의 다른 데이터베이스가 있습니다. 다른 데이터베이스에는 성능 문제가 없으며 앞에서 언급 한 기성품 이외의 데이터베이스 만 있습니다.

SQL Server가 현재 메모리에 가지고있는 모든 쿼리 계획을 지우는 방법이 있습니까?

동일한 서버의 다른 데이터베이스에 의존하는 30 명 정도의 사용자에게 영향을주지 않으면 서 어떻게해야합니까?


답변:


7

이전 답변에 사과드립니다.

1) 조회가 스토어드 프로 시저에서 실행될 때마다 다를 수 있음을 알고 있으면 WITH RECOMPILE 옵션을 CREATE PROCEDURE 문에 추가하십시오. WITH RECOMPILE 옵션을 사용하면 저장 프로 시저 실행 계획을 다시 사용할 수 없으므로 SQL Server는이 프로 시저에 대한 계획을 캐시하지 않으며 프로시 저는 런타임에 다시 컴파일됩니다. WITH RECOMPILE 옵션을 사용하면 저장 프로 시저에서 쿼리를 실행할 때마다 쿼리가 변경 될 경우 성능이 향상 될 수 있습니다.이 경우 잘못된 실행 계획이 사용되지 않기 때문입니다.

2) 실행 계획을 강제 실행하려면 모든 유형의 쿼리 (모든 저장 프로 시저 요청 유형)에 대해 USE PLAN 쿼리 힌트를 사용하는 계획 지침만들어야합니다 .

다음은 도움이 될 수있는 실행 계획에 대한 기사 입니다.


WITH RECOMPILE을 사용하는 데 동의합니다. 구축 한 시스템에서이 작업을 수행했습니다. 그러나 SQL 소스에 액세스 할 수 없습니다 ... 응용 프로그램 내에서 실행됩니다.
Michael Riley-AKA Gunny

@Cape Cod Gunny이 경우 DBCC FLUSHPROCINDB를 시도하십시오. 전체 SQL Server가 아닌 SQL Server의 특정 데이터베이스에 대한 저장 프로 시저 캐시를 지우는 데 사용됩니다. 이전 저장 프로 시저 계획이 테스트 결과에 부정적인 영향을 미치지 않도록 테스트하기 전에이 명령을 사용할 수 있습니다. 예 : DECLARE @intDBID INTEGER SET @intDBID = (master.dbo.sysdatabases에서 dbid를 선택하십시오 (이름 : 'database_name') DBCC FLUSHPROCINDB (@intDBID)
garik

문제가 해결되었습니다. 검색 기준을 저장하는 데 사용 된 임시 테이블이 영구적으로 데이터를 축적하고있는 것으로 나타났습니다. 프로세스는 데이터를 수집하기 전에이 테이블에서 데이터를 잘라야합니다. 멋진 SQL 스 니펫에 감사드립니다.
마이클 라일리-일명

13

여기에 두 가지 질문이 있습니다. 먼저, SQL 인스턴스의 메모리에 저장된 모든 계획을 제거 할 수 있는지 알고 싶습니다. 이는 Matt M이 제안한대로 DBCC FREEPROCCACHE를 사용하여 수행됩니다.

두 번째 질문은 "동일한 서버의 다른 데이터베이스에 의존하는 30 명 정도의 사용자에게 영향을주지 않으면 서 어떻게해야합니까?"입니다. 짧은 대답은 "당신은 할 수 없습니다"입니다. 메모리에있는 계획에 의존하는 다른 사용자보다 모든 계획을 제거하면 성능이 저하 될 수 있습니다.

이 문제를 해결하려면 몇 가지 수동 개입이 필요합니다. DBCC FREEPROCCACHE를 사용하여 plan_handle이있는 특정 계획을 제거 할 수 있습니다.

위에서 설명한 내용에서 계획 문제처럼 들리지만 계획을 제거하는 것이 답인지 확실하지 않습니다. 계획 제거에 대해 생각하기 전에 매개 변수 스니핑 방향을 알려 드리겠습니다.

http://blogs.msdn.com/b/conor_cunningham_msft/archive/2010/08/11/conor-vs-misbehaving-parameterized-queries-optimize-for-hints.aspx

예약 된 시간에 DBCC FREEPROCCACHE를 사용하는 대신 쿼리를 최적화 할 수 있어야합니다. 또한 인스턴스의 대기 이벤트를 분석하는 데 시간을 할애하는 것이 좋습니다.


DBCC FREEPROCCACHE가 문제를 해결하지 못했습니다. 활동과 이벤트를 모니터링합니다. 0 개의 물리적 I / O가 있습니다. 이 응용 프로그램에 매달려있는 것 같습니다 : .Net Sql Client Data Provider. 대기 유형은 CXPACKET입니다.
Michael Riley-AKA Gunny

CXPACKET은 쿼리가 병렬로 진행됨을 나타냅니다. 쿼리에 대해 실행중인 스레드 수를 확인하고 대기를 검사 할 수 있습니까? Adam Machanic의 무료 도구 인 WhoIsActive sqlblog.com/files/folders/release/entry29675.aspx 를 사용할 수 있습니다 .
SQLRockstar

7

DBCC FREEPROCCACHE

이 명령을 사용하면 전체 프로 시저 캐시를 단일 명령으로 지울 수 있습니다. 이 명령을 사용하기 전에 설명서를 반드시 읽으십시오. 비고 섹션을 몇 번 읽으십시오.

프로 시저 캐시를 지우면 다음에 사용할 때 스토어드 프로 시저 캐시가 다시 컴파일됩니다. 이는 성능에 영향을 줄 수 있습니다. 조심해서 사용하십시오!

매트


DBCC FREEPROCCACHE를 사용해 보았지만 문제가 해결되지 않았습니다. 나는 1 시간 후에 그 과정을 죽였습니다.
Michael Riley-AKA Gunny
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.