많은 테이블이 조인 된 복잡한 쿼리가 있습니다. 복잡성 때문에 실제 쿼리를 작성하기가 어렵습니다.IN 절 안에있는 항목 수가 4 개를 초과하면 SQL Server 쿼리가 매우 느립니다.
때문이다 내가 찾은
select t1.id, t2.id, t1.name, t2.name
from table1 t1, table2 t2
left join table3 t3 ON t2.id = t3.id
where t2.id = t1.ref_id
and t1.ref_id IN ('id1', 'id2', 'id3', 'id4', 'id5', ...)
, 그 내가 IN 절 안에있는 경우 ('ID1', 'ID2', 'ID3'IN이 t1.ref_id 같은 단지 4 개 이하의 값을, '같은 id4 ') 매우 빠르게 작동합니다 (16 밀리 초). tidref_id IN ('id1', 'id2', 'id3', 'id4', 'id5') 실행 시간이 40 배로 늘어나고 600 ms가됩니다. 이 동작을 제어하는 몇 가지 매개 변수가 같은
나는 SQL 서버 것 같습니다 2014 년에있어. 다른 SQL 서버 (SQL Server 2008)에서이 쿼리를 시도했지만 제한을 찾을 수 없습니다.
내 질문 : 이러한 종류의 동작을 제어하는 매개 변수가 있습니까? 또는이 이상한 한계를 예를 들어 50으로 늘리는 방법.
단지 4 개가 아닌 30-50 개로 늘리고 싶습니다. 물론 수백 수천 개의 값을 가진 IN 절을 생성하고 싶지는 않습니다. 나는 이유를 발견 같은
select t1.id, t2.id, t1.name, t2.name, t3.name
from table1 t1, table2 t2
left join table3 t3 ON t2.id = t3.id
where t2.id = t1.ref_id
and t1.ref_id IN ('id1', 'id2', 'id3', 'id4', 'id5', ...)
이 UPDATE2
가 보이는 :
갱신 1
미안 해요, 난 그렇지 않으면 내가 필요하지 않은 T3처럼 보이는 선택 t3.name을 넣어 잊어 버렸습니다. 문제는 IN 내부의 항목 수에 관한 것이 아닙니다. 나중에이 문제를 4 개 미만의 ID로 재현했습니다 (1 개 포함). 어떤 ID는 t1.ref_id에 표시되지 않았기 때문에 발생합니다. t1.ref_id에 존재하지 않는 id가있을 때, 그것이 빠를 때, t1.ref_id에 존재하는 id를 추가 할 때, 느리게 될 때. 이전 예제에서 id1 - id4는 t1.ref_id에 표시되지 않았고 id5가 제시되었습니다. 이 때문에 id5를 추가 할 때 속도가 느려집니다. IN 절 안에 id (id5)를 1 개만 넣어도 속도가 느려집니다. 마지막으로 t1.ref_id의 인덱스가 문제를 해결했습니다. 4 개 또는 5 개의 ID 주변에는 마법이 없었습니다. 제 구체적인 예에서 우연의 일치입니다.
t1.ref_id에 색인을 생성 했습니까? –
차이를 좁히기 위해 잘 해왔습니다. 이제 느린 버전과 빠른 버전 간의 쿼리 계획을 비교하십시오. 너는 무엇을 보느냐. 쿼리 계획을 보려면 CTRL-L을 누릅니다. –
암시 적 및 명시 적 조인 구문을 함께 사용해서는 안되며 명시 적 구문으로 다시 작성해야합니다. 그것은 1992 년 이래 ANSI 표준입니다! 이 쿼리는 저장 프로 시저의 일부입니까? 'OPTION (RECOMPILE) '을 추가하면 도움이됩니까? – HoneyBadger