2014-10-13 1 views
4

SQL Server 2008 R2에서 이상한 동작이 발생합니다. 내가 수동으로 쿼리를 실행하고 다음과 같이 변수 @ColumnValue를 선언 할 때쿼리에서 사용되었지만 저장 프로 시저에서 인덱스 검색에 사용 된 인덱스 찾기

UPDATE TableToUpdate 
SET  ColumnToUpdate = @ColumnValue 
WHERE ColumnA IN 
     (
      SELECT ColumnA 
      FROM SubQ1Table 
      WHERE ColumnToUpdateReference = @ColumnValue 
     ) 
and  ColumnB in 
     (
      SELECT ColumnB 
      FROM SubQ2Table 
      WHERE ColumnToUpdateReference = @ColumnValue 
     ) 

:

나는 다음과 같은 쿼리를

그것은 초에서 실행되고에서 인덱스 탐색 않습니다
DECLARE @ColumnValue INT = 123; 

index covering columns TableToUpdate 테이블의 ColumnA, ColumnB 및 ColumnToUpdate입니다.

나는 매개 변수에 전달 제외하고는 정확한 쿼리를 사용하여 저장 프로 시저를 만들 때 .. 예 :

EXEC sp_Query 123 

인덱스 스캔 같은 인덱스에 사용 완료하는 데 약 30 초 정도 소요됩니다.

두 쿼리 계획을 모두 보았습니다. 첫 번째 차이점을 왼쪽에서 오른쪽으로 읽는 것은 저장 프로 시저가 중첩 루프 (내부 조인)를 수행하는 것 같습니다. 반면 직접 쿼리는 스트림 집계 (집계)를 수행합니다.

왜이 저장 프로 시저를 통해이 SQL을 호출하면 차이가 발생합니까? 더 이상 정보를 제공해야하는 경우 알려주십시오.

미리 감사드립니다.

탐.

+3

[매개 변수 스니핑] (http://sqlperformance.com/2013/08/t-sql-queries/parameter-sniffing-embedding-and-the-compatile-options)과 같은 소리가 나에게 들립니다. – GarethD

답변

2

처럼 GarethD이 매개 변수 스니핑 할 수 것처럼 (시도) 나를 보자, 당신은 그게 뭔지 모르는 경우, 소리 않으며, 제안 설명 .

SQL Server는 프로 시저가 처음 실행될 때 보낸 매개 변수를 "스니핑 (sniffing)"하여 저장 프로 시저를 컴파일하고이 실행 계획을 나중에 참조 할 수 있도록 계획 캐시에 저장합니다.

프로 시저가 실행될 때마다 SQL Server는 캐시에서 실행 계획을 검색하여 사용합니다 (재 컴파일 이유가없는 한).

저장 프로 시저가 처음 실행될 때 매개 변수 집합에 대해 허용 가능한 계획을 생성하지만 다른 매개 변수 집합에 대해서는 매우 나쁜 매개 변수 집합이 사용되는 경우 문제가 발생할 수 있습니다.

은 내가 생각할 수있는이 주위에 몇 가지 방법이 있습니다 :

이 문제를 극복하기 위해 몇 가지 해결 방법이 있습니다.

OPTION (RECOMPILE) 
OPTION (OPTIMIZE FOR (@VARIABLE=VALUE)) 
OPTION (OPTIMIZE FOR (@VARIABLE UNKNOWN)) 
Use local variables 

귀하의 설정에 따라 다르지만 주위에 읽음이 있습니다.저장 프로 시저의 이름을 지정할 때

https://www.simple-talk.com/sql/t-sql-programming/parameter-sniffing/

Parameter Sniffing (or Spoofing) in SQL Server

SQL Server - parameter sniffing

또한 보조 노트에 'SP_'의 사용을 조심 - 그것은 크다 아니오. this article을 확인하십시오. 자세한 내용은 sp_를 사용하여 자세히 살펴보십시오.

+2

감사합니다. 이것은 쿼리 계획을 다른 것으로 만드는 원인입니다. –

2

저장 프로 시저에서 데이터 형식 매개 변수를 확인할 수 있습니까?

int 유형이 아닌 경우 암묵적인 대화가 발생하여 색인 스캔이 발생합니다.

+0

나는 이것을 검사했고 int였다. 감사 –

관련 문제