IN
절이있는 sql 쿼리가 있습니다. 쿼리 계획 캐싱을 향상시키기 위해 테이블 반환 매개 변수를 사용하기로 결정했습니다. 다음은 샘플 WHERE ID IN (SELECT ID FROM @P1)
입니다. P1 @ 는 다음과 같은 유형의 변수입니다 :in 절에 대한 테이블 반환 매개 변수가 더 느립니다.
CREATE TYPE [dbo].[Ids] AS TABLE(
[ID] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
하지만 일부 쿼리가 느려질 것을 알 수 있습니다. 내 DB에 2.1 초에 수행
select * from SomeTable s where ((s.SomeForeignId in (select id from @p1)) or s.SomeForeignId is null)
: 다음은 쿼리 예입니다.
그리고 된 쿼리 : 1.8 초에
select * from SomeTable s where ((s.SomeForeignId in (1,2,3.....)) or s.SomeForeignId is null)
수행한다.
쿼리 계획의 차이점을 확인했습니다. 첫 번째 쿼리의 계획은 두 부분으로 구성됩니다 (하나는 null 검사, 하나는 in 절). 그런 다음 연결이됩니다. 두 번째 계획은 단지 색인 찾기 일뿐입니다.
성능 향상을 위해 매개 변수가있는 쿼리를 향상시킬 수있는 방법이 있습니까?
P. 이 샘플은 증류 된 쿼리 일 뿐이므로이 in (select id from @p1)
부분에 잘못된 것이 있는지 알고 싶습니다.
ofcourse ... 선택 진술을 실행하는 서버의 시간이 단축됩니다 –
인덱스, 테이블의 행 수 및 전달할 값의 수를 포함하여'SomeTable'의 테이블 구조를 표시 할 수 있습니까? '@ p1'? 또한 SELECT *를 사용하면서 두 번째 계획에서 인덱스 찾기를 얻는 방법을 명확히 할 수 있습니까? 실제 실행 계획을 어딘가에 게시 할 수 있습니까? –
이것은 샘플 쿼리 일뿐입니다. 표는 1 백만 mln 개의 레코드를 포함하고 @ p1은 약 20 개의 레코드를 포함하고 쿼리 결과는 약 50,000 개의 레코드를 포함합니다. 나는 그 "in (select id from @ p1)"이 절의 매개 변수화에 올바른 방법인지 확인하고 싶습니다. – struhtanov