T-SQL에서 IF를 사용하면 실행 계획 캐싱이 약화되거나 중단됩니까?


20

t-SQL 배치에서 IF 문을 사용하는 것이 성능에 해롭다는 것이 나에게 제안되었습니다. 확인을 찾거 나이 주장을 확인하려고합니다. SQL Server 2005 및 2008을 사용하고 있습니다.

주장은 다음과 같은 배치입니다.

IF @parameter = 0
 BEGIN
  SELECT ... something
 END

ELSE
 BEGIN
  SELECT ... something else
 END

다음 실행에는 다른 분기가 필요할 수 있으므로 생성 된 실행 계획을 SQL Server에서 재사용 할 수 없습니다. 이는 SQL Server가 현재 실행에 대해 어느 분기가 필요한지를 이미 결정할 수 있다는 사실에 따라 실행 계획에서 하나의 분기를 완전히 제거한다는 것을 의미합니다. 이것이 사실입니까?

또한이 경우에는 다음과 같은 일이 발생합니다.

IF EXISTS (SELECT ....)
 BEGIN
  SELECT ... something
 END

ELSE
 BEGIN
  SELECT ... something else
 END

어느 브랜치를 실행할지 미리 결정할 수없는 곳은 어디입니까?



1
SQL Server는 분기를 고려하지 않고 분기에 포함 된 명령문 만 고려하여 실행 계획을 재사용 할 수 있습니다.
MartinC

답변:


10

SQL Server는 저장 프로 시저 내부의 조건부 분기를 무시하여 저장 프로 시저에 대한 쿼리 계획 컴파일 프로세스를 최적화합니다. 계획은 첫 번째 실행에 사용 된 매개 변수를 기반으로 생성되며, 매개 변수가 분기에 대해 다른 경우 문제가 발생할 수 있습니다.

각 분기에 대한 SQL을 자체 저장 프로 시저에 배치하여 생성 된 계획이 해당 분기에 대한 실제 매개 변수 사용을 기반으로합니다.


6

유일한 지름길은 IF 1 = 1

@parameter와 EXISTS 모두 여전히 "일반적인 사례"( @parameter = 42예 :

말하자면 ... 실제 실행 계획은 프로파일 러가 재구성 이벤트를 캡처 하는 것과 무엇을 말합니까? (나는 Jao의 답변에 따라 예상 계획을 싫어합니다)


3

실제가 아닌 예상 실행 계획을 표시하십시오. 첫 번째 COND연산자 에는 연산자 가 포함되어 있습니다 .

이 연산자는 캐시 된 실행 계획에도 포함되었습니다. 귀하의 예에서 예상 실행 계획에는 하나의 COND 연산자와 2 개의 SELECT 분기가 포함되므로 완전히 재사용 할 수 있습니다. 배치를 실행할 때 SQL Server는 DML 문뿐만 아니라 다른 모든 문도 평가하므로 계획에서 가져옵니다.

내부 실행 계획은 표현식 트리와 유사한 구조입니다.


0

전달 된 매개 변수를 기반으로 계획이 만들어 지므로 실제로는 아니오라고 말합니다. 일반적으로 매개 변수를 기반으로하는 조건부 논리를 갖는 것은 성능에 해롭지 않습니다.

매개 변수로 인해 쿼리 최적화 프로그램에 충분한 분산이 있다고 가정하면 여러 계획이 생성됩니다.

Show Execution 계획을 켜고 스크립트를 실행하여 계획 중 차이점을 확인할 수 있습니다. 프로 시저를 실행할 때 (여기서는 스토어드 프로 시저를 가정하고 있음) 처음에는 일반적으로 빠르며 두 번째 히트는 저장된 계획을 사용합니다. 매개 변수를 변경하고 반복 한 다음 원래 매개 변수를 실행하십시오. 이론적으로 계획은 여전히 ​​캐시에 있지만 서버 사용에 따라 다릅니다 (캐시 틱-영원히 유지되지 않습니다.)


0

아마도 2005 년과 2008 년에 개선되었을 수도 있지만 2000 년에 조건을 사용하는 것이 설명하는 것보다 더 나쁠 수 있습니다. 프로 시저의 첫 번째 실행을 가장 잘 처리하도록 계획을 컴파일 한 다음 해당 계획을 사용하여 조건이있는 경우에도 프로 시저를 실행합니다 변경되었습니다. 내 경험상 이로 인해 몇 분 동안 실행 된 쿼리가 몇 시간 내에 실행되었습니다. 지금은 2008을 사용하고 2005를 사용했지만 더 이상 사용하지 않기 때문에 좌표가 어떻게 작동하는지에 대해서는 언급 할 수 없습니다.


2
2005+는 문장 수준의 재 컴파일을 제공하므로 더 이상 "sp per one plan"이 없습니다
gbn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.