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을 호출하면 차이가 발생합니까? 더 이상 정보를 제공해야하는 경우 알려주십시오.
미리 감사드립니다.
탐.
[매개 변수 스니핑] (http://sqlperformance.com/2013/08/t-sql-queries/parameter-sniffing-embedding-and-the-compatile-options)과 같은 소리가 나에게 들립니다. – GarethD