2014-04-09 2 views
4

MS-SQL의 버그 3 분.이 나는 ​​다음과 같은 우리의 설정에 오류 또는 MS-SQL에서 버그가 있는지 알고 싶습니다

CREATE PROCEDURE [dbo].[ourProcedure] 
    @param1  int, 
    @param2  int, 
    @param3  dateTime 
AS 
BEGIN... 

동일한 절차를 실행했지만 작성시 매개 변수의 로컬 복사본을 만들었지 만 11 초 밖에 걸리지 않았습니다!

CREATE PROCEDURE [dbo].[ourProcedure] 
    @param1_x int, 
    @param2_x int, 
    @param3_x dateTime 
AS 
BEGIN 

DECLARE @param1 int 
DECLARE @param2 int 
DECLARE @param3 dateTime 

@param1 = @param1_x 
@param2 = @param2_x 
@param3 = @param3_x 
... 

누가 내 이유를 말해 줄 수 있습니까? SQL이 C#과 같은 매개 변수를 처리하지 않는 이유는 무엇입니까?

+1

나머지 SP를 보여줄 수 있습니까? 또는 더 나은 방법 : 두 변형의 쿼리 계획을 비교하십시오. 나는 그것이 어떤 종류의 매개 변수 스니핑과 관련이 있다고 생각한다. 그것은 "SQL 성능"문제 (예 : 인터프리터)가 아니지만 생성하는 일부 선택에 대해 다른 쿼리 계획이라고 생각합니다. – TomTom

+0

아니요, SP의 속도 저하 원인이 될 수 없습니다. SP 내부 쿼리 일 수 있습니다. 쿼리를 게시하십시오. – Rahul

+0

"SP의 느림"응? 내 질문을 읽었 니? SP와 유일한 차이점은 매개 변수를 복사하는 로컬 변수를 추가했기 때문입니다. –

답변

6

이것은 일반적으로 "매개 변수 스니핑"이라고합니다. SQL Server 최적화 프로그램은 매개 변수 값과 함께 값 분포에 대한 내부 통계 정보를 사용하여 프로 시저에 전달 된 값의 카디널리티를 계산하고 실행 계획을 생성합니다. 그러나 이것은 여러 가지 이유로 잘못 될 수 있습니다. make 할 다른 포인트는 실행 계획이 캐시되어 프로 시저가 처음 실행될 때 최적화된다는 것입니다. 프로 시저를 최적화하는 데 사용되는 매개 변수가 현재 매개 변수와 충분히 다를 경우 성능이 저하 될 수 있습니다.

옵티마이 저는 변수 할당이 최적화 중이며 미리 알려지지 않은 동일한 배치의 일부이기 때문에 동일한 값을 사용할 수 없습니다. 이 경우에는 다른 실행 계획에서 결과를 얻는 경험적 방법과 평균을 사용합니다.

간략히 말하자면 첫 번째 매개 변수는 다른 매개 변수 값 집합에 최적화 된 두 가지 실행 계획이 있습니다.

+0

RECOMPILE을 수행하지 않고 캐시를 지우면 해결할 수 있습니까? (참고 : 우리는 succes없이 시도했습니다) 적어도 SP를 처음 실행했을 때 동일한 성능을 얻을 수 있습니까? –

+1

다시 컴파일하면 캐싱 된 계획 문제 만 해결되지만 (두 번째 절차에서 사용 된 변수로 인해) 두 가지 계획을 계속 얻게됩니다. 실행 계획을 보지 않고 첫 번째 계획이 비효율적 인 이유를 말할 수 없다. (단지 그 그림을 의미하지는 않는다.) – dean

+0

@JoakimM SP의 쿼리에'option (recompile) '을 추가하면 똑같이 얻어야한다. 두 경우 모두. 그리고 그 외모에 의해 두 가지 경우 모두 나쁜 계획을 세워야합니다. 테스트 할 또 다른 것은 쿼리에서'option (unknown for optimize)'를 사용하는 것입니다. 그렇다면 여전히 동일한 계획을 세워야하지만 매개 변수에서 알려진 값을 사용하지 않고 최적화하기 때문에 좋은 계획이됩니다. –

관련 문제