2012-07-23 3 views
1

끔찍한 성능의 저장 프로 시저에 문제가 있습니다. 이상한 부분은 내가 절차를 실행하면 몇 시간이 걸린다는 것입니다. 프로 시저의 내용을 ssms에서 배치로 실행하면 합리적인 시간 내에 실행됩니다. 문제를 proc 내의 단일 명령문으로 좁혔습니다.실행 계획 - SQL 대 해시 대 병합 프로 시저

첫 번째 생각은 잘못된 쿼리 계획 캐시였습니다. 그러나 WITH RECOMPILE을 proc 또는 OPTION (RECOMPILE)에 추가하면 proc 내의 잘못된 명령문에 아무런 차이가 없습니다.

그래서 나는의 (실제) 실행 계획을 캡처 한 두 간부 - 보내고 절차를이 차이를 직접 문을 실행하고 발견

가 느린 저장 프로 시저 버전은 일반 SQL 반면 XML에 <Merge ManyToMany="True"> 요소가를 버전은 <Hash>입니다.

나는 왜 그것이 하나 또는 다른 것을 선택할 것인지를 결정하기위한 실행 계획에 대해 충분히 알지 못한다고 생각합니다.

두 버전 모두 동일한 데이터에서 실행되었다 - 등 :

BEGIN TRANSACTION; 
exec myproc; --capture plan 
ROLLBACK TRANSACTION; 
BEGIN TRANSACTION 
SQL Statements from procedure -- capture 2nd plan 
ROLLBACK TRANSACTION 

SSMS에서 직접 실행할 때 다른 것이 프로 시저 내 계획에 영향을 미칠 수있는 것들이 어떤 종류의? 누구든지 이것을 더 좁히는 방법에 대한 제안이 있습니까?

내가 얼마나이 특정 쿼리가 여기에 도움 모르겠지만,이 MERGE 문의 :

MERGE schema.UpdatableView FORUPDATE 
USING 
(
    large select statement that's not part of the problem 
) DATA 
ON DATA.field = FORUPDATE 
WHEN MATCHED THEN -- 50% of the cost is here 
    UPDATE SET 
     LOTS of field updates 
WHEN NOT MATCHED THEN -- other 50% is here 
    INSERT (FIELDS) 
    VALUES (FIELDS 
OPTION (RECOMPILE) 
; 

업데이트 할 수있는 뷰는 문제의 일부가 될 수 있지만, SQL 프로파일 러는 생각하지 않는 것 그래서. 뷰에있는 기본 INSERT 및 UPDATE 트리거는 명령문이 몇 시간 동안 실행되고 합리적인 시간 내에 완료 될 때까지 시작되지 않습니다.

+0

기본 테이블의 행 수는 얼마입니까? 최근에 통계를 업데이트 한 적이 있습니까? –

+0

대략 40-50K 행의 테이블이 업데이트되고 USING 하위 절과 거의 동일한 양이 업데이트됩니다. – Clyde

+0

통계는 기본 테이블에 최신으로 표시됩니다. 그러나 SSMS 업데이트 할 수있는보기에 대한 통계를 표시하지 않습니다. 이게 중요합니까? 그리고 왜 이것이 저장 프로 시저와 일반 SQL 실행간에 다른 데이터를 제공합니까? – Clyde

답변

0

이것은 보통 ANSI_NULLSQUOTED_IDENTIFIER과 같은 런타임 설정이 다르기 때문입니다. 쿼리를 테스트하는 데 사용하는 동일한 SSMS 탭 (동일한 세션)에서 저장 프로 시저와 뷰를 다시 만드는 것이 좋습니다. 이렇게하면 둘 다 동일한 설정을 사용하게됩니다. 두 계획 모두 동일한 계획을 사용한다는 것을 알게 될 것입니다.

관련 문제