2015-01-22 3 views
0

처음에 막연한 주제 이름을 유감스럽게 생각합니다 (나는 더 나은 것을 생각할 수 없었습니다).SQL Server IN vs = 쿼리에서 (하나의 값에 대해)

SO 대답은 IN에 대해 =을 집어 넣을 때 성능에 영향이 있는지를 생각해 보았습니다.

select 1 id, 'abc' name into #a union 
select 2, 'abcd' union 
select 3, 'abcde' 

select * from #a where id = 1 ------ Query 1 
select * from #a where id in (1)------ Query 2 

두 쿼리에 대한 쿼리 계획을 확인한 후 나에게도 동일한 것으로 나타났습니다 (아마 그 이유는 단순한 것일 수도 있습니다).

IN을 사용할 때 성능 우수 사례를 위반하고 있습니까? 물론 오버 헤드가 포함되어야합니다. IN은 여러 항목을 처리 할 수 ​​있으며 심지어는 SELECTS을 처리 할 수 ​​있습니다. query4이 작동 할 동안

select * from #a where id = (SELECT id from #a where id = 1)------ Query 3 
select * from #a where id in (SELECT id from #a where id = 1)------ Query 4 

QUERY3는 실패, 나는 IN이 기능의 측면에서 훨씬 더 제공합니다 알고 있지만, 경우에 여러 레코드가 id = 1을 위해있을 때. 따라서 앞으로 =IN으로 바꾸고 싶습니다. 그러나 나는 잠재적 인의 트레이드 오프를 알고 싶다.

EDIT 나는 SQL 엔진이이 문장을 어떻게 처리 하는지를 배우는 데 관심이있다.

+1

일반적으로 쿼리 3과 4를 조인으로 다시 작성하므로 IN 또는 =이 필요하지 않습니다. –

+0

이것을 고려해보십시오. – SouravA

+0

"="연산자는 "IN"보다 빠릅니다. 사용을 확인하고 싶다면 통계 시간 설정 켜기 –

답변

0

질문의 성능 측면을 무시하면 디자인 문제가 있습니다. 의도 코드을 작성하여 다른 사람이 코드를 읽을 때 달성하려는 내용을 더 잘 이해할 수 있도록해야합니다. 은 정확히 하나의 레코드를 반환하기 위해SELECT id from #a where id = 1을 기대합니까? 그렇다면 '='을 사용하십시오. 0 이상을 반환하면 '='이 잘못 될 것입니다.

+0

동의 함. 실제로 SQL 엔진이 훨씬 낮은 수준인지, 실제로 'IN'과 '='를 다르게 취급하는지에 대한 호기심으로이 질문을 던졌습니다. 반복해야 할 필자의 질문은 순전히 엔진 작동 방식을 이해하는 것입니다. – SouravA

+0

이 성능 측면은 훨씬 더 복잡합니다. '='연산자는 '='연산자이며 훌륭하고 예측 가능합니다. 그러나 'IN'은 여러 가지 요인에 따라 여러 가지 방식으로 쿼리 계획에 나타납니다. –

0

"="과 "in"사이의 유일한 고려 사항은 색인 효율성입니다. 따라서 인덱스를 이용하려면 "="을 사용해야합니다.

"in"문은 무시할 수 없습니다. "="은 허용됩니다.

쿼리 3과 4는 하위 쿼리에서 추가 테이블 스캔을 수행하므로 조인과 비교할 때 효율성이 떨어집니다.

+0

나는 동의하지 않는다.id 컬럼에 클러스터 된 인덱스를 생성하고 두 쿼리가 모두 '인덱스 탐색'연산을 사용하고 있음을 테스트하고 보았습니다. 그래서 예, 쿼리 4에 대해서도 인덱스 IS가 사용되었습니다 – SouravA

+0

"in"및 "="연산자는 연산자가 sargable 또는 not-sargable이라고 말하는 것은 잘못되었습니다. 많은 요인에 따라 표정이 일치하거나 일치하지 않습니다. –

0

일반적으로 IN은 복수의 = 술어로 나뉘며 쿼리를 만족시키는 데 사용됩니다. 귀하의 예제에서와 같이 인덱스 (가정)에 사용될 때 개별 술어가 인덱스 찾기 조작에 사용됩니다. 직접 해보십시오. 실행 계획의 '인덱스 탐색'작업에서 검색 술어를 살펴보십시오.