EXISS 대 ISISS 절의 가입 및 사용
다음은 코드 샘플입니다.
CREATE TABLE #titles(
title_id varchar(20),
title varchar(80) NOT NULL,
type char(12) NOT NULL,
pub_id char(4) NULL,
price money NULL,
advance money NULL,
royalty int NULL,
ytd_sales int NULL,
notes varchar(200) NULL,
pubdate datetime NOT NULL
)
GO
insert #titles values ('1', 'Secrets', 'popular_comp', '1389', $20.00, $8000.00, 10, 4095,'Note 1','06/12/94')
insert #titles values ('2', 'The', 'business', '1389', $19.99, $5000.00, 10, 4095,'Note 2','06/12/91')
insert #titles values ('3', 'Emotional', 'psychology', '0736', $7.99, $4000.00, 10, 3336,'Note 3','06/12/91')
insert #titles values ('4', 'Prolonged', 'psychology', '0736', $19.99, $2000.00, 10, 4072,'Note 4','06/12/91')
insert #titles values ('5', 'With', 'business', '1389', $11.95, $5000.00, 10, 3876,'Note 5','06/09/91')
insert #titles values ('6', 'Valley', 'mod_cook', '0877', $19.99, $0.00, 12, 2032,'Note 6','06/09/91')
insert #titles values ('7', 'Any?', 'trad_cook', '0877', $14.99, $8000.00, 10, 4095,'Note 7','06/12/91')
insert #titles values ('8', 'Fifty', 'trad_cook', '0877', $11.95, $4000.00, 14, 1509,'Note 8','06/12/91')
GO
CREATE TABLE #sales(
stor_id char(4) NOT NULL,
ord_num varchar(20) NOT NULL,
ord_date datetime NOT NULL,
qty smallint NOT NULL,
payterms varchar(12) NOT NULL,
title_id varchar(80)
)
GO
insert #sales values('1', 'QA7442.3', '09/13/94', 75, 'ON Billing','1')
insert #sales values('2', 'D4482', '09/14/94', 10, 'Net 60', '1')
insert #sales values('3', 'N914008', '09/14/94', 20, 'Net 30', '2')
insert #sales values('4', 'N914014', '09/14/94', 25, 'Net 30', '3')
insert #sales values('5', '423LL922', '09/14/94', 15, 'ON Billing','3')
insert #sales values('6', '423LL930', '09/14/94', 10, 'ON Billing','2')
SELECT title, price
FROM #titles
WHERE EXISTS
(SELECT *
FROM #sales
WHERE #sales.title_id = #titles.title_id
AND qty >30)
SELECT t.title, t.price
FROM #titles t
inner join #sales s on t.title_id = s.title_id
where s.qty >30
동일한 결과를 제공하는 상기 2개의 쿼리의 차이점이 무엇인지 알고 싶습니다.또한 EXISTES 키워드의 목적과 정확한 사용처를 알고 싶으십니까?
EXISTS
는 부울 값을 반환하는 데 사용됩니다.JOIN
다른 테이블 전체를 반환합니다.
EXISTS
하위 쿼리가 결과를 반환하는지 여부와 단락을 즉시 테스트하는 데만 사용됩니다. JOIN
관계가 있는 다른 테이블의 추가 필드와 결합하여 결과 집합을 확장하는 데 사용됩니다.
예제에서 쿼리는 의미론적으로 동일합니다.
일반적으로, 사용EXISTS
다음과 같은 경우:
- 관련 테이블에서 데이터를 반환할 필요가 없습니다.
- 관련 테이블에 듀프가 있습니다(
JOIN
값이 반복될 경우 행이 중복될 수 있음) - 존재를 확인하려는 경우(대신 사용)
LEFT OUTER JOIN...NULL
조건)
만약 당신이 적절한 인덱스를 가지고 있다면, 대부분은EXISTS
동일한 성능을 발휘합니다.JOIN
예외는 일반적으로 사용이 더 빠른 매우 복잡한 하위 쿼리에 있습니다.EXISTS
.
만약 당신이JOIN
키가 인덱싱되지 않았습니다. 사용하는 것이 빠를 수 있습니다.EXISTS
하지만 당신은 당신의 구체적인 상황을 테스트해야 할 것입니다.
JOIN
구문은 읽기 쉽고 일반적으로 더 명확합니다.
- 존재는 반접합입니다.
- 조인은 조인입니다.
그래서 3행과 5행이 일치합니다.
- JOIN은 15개의 행을 제공합니다.
- 존재는 3개의 행을 제공합니다.
그 결과 다른 사람들이 언급한 "단락" 효과가 발생하며 JIN과 함께 DISTINCT를 사용할 필요가 없습니다.1:n 관계의 n측에서 행의 존재를 찾을 때는 거의 항상 EXISTES가 더 빠릅니다.
EXISTS
기본적으로 단축키에 사용됩니다.기본적으로 Optimizer는 조건이 충족되는 즉시 구제되므로 전체 테이블을 검색할 필요가 없을 수 있습니다(현대 버전의 SQL Server에서는 이러한 최적화가 다음에 대해 발생할 수 있음).IN()
또한, 비록 이것이 항상 사실은 아니었지만).이러한 동작은 쿼리마다 다를 수 있으며, 경우에 따라 조인이 실제로 최적화 도구가 작업을 수행할 수 있는 더 많은 기회를 제공할 수 있습니다.그래서 저는 "지금이 당신이 사용해야 할 때입니다."라고 말하기는 어렵다고 생각합니다.EXISTS
그리고 이것은 당신이 하지 말아야 할 때입니다. 왜냐하면, 많은 것들처럼, "그것은 의존합니다."
즉, 이 경우 테이블 간에 기본적으로 1:1 일치가 있기 때문에 성능 차이를 볼 수 없으며 최적화 도구는 유사하거나 동일한 계획을 생성할 가능성이 높습니다.각 제목에 대해 50,000개의 행을 추가할 때 판매 테이블에서 조인/존재를 비교하면 다른 것을 볼 수 있습니다(단, 중복, 집계 등을 제거하려면 조인 쿼리를 변경해야 합니다).
다른 행과 상호 작용하는 방식에 따라 제외할 행이 있을 때 가장 유용합니다.
예를들면,
SELECT *
FROM TABLE a
WHERE a.val IN (1,2,3)
AND NOT EXISTS(SELECT NULL
FROM TABLE b
WHERE b.id = a.id
AND b.val NOT IN (1, 2, 3))
에는 제 이경우에, 나행의을제것외입다니에서 행을 하는 것입니다a
를기로쿼가 있는 .b
ID는 같지만 유효하지 않은 레코드입니다.
이것은 사실 제가 직장에서 겪었던 생산 문제에서 비롯되었습니다.쿼리는 응용 프로그램 대신 쿼리에서 제외 로직의 대부분을 이동하여 로드 시간이 24초 이상에서 2초 미만으로 단축되었습니다. :-)
언급URL : https://stackoverflow.com/questions/7082449/exists-vs-join-and-use-of-exists-clause
'programing' 카테고리의 다른 글
v-switch 또는 확인란을 클릭하면 Vuejs가 클릭한 행을 다른 테이블로 이동합니다. (0) | 2023.07.09 |
---|---|
세 개의 테이블을 안쪽 접합 (0) | 2023.07.09 |
C에서 배열의 길이를 구하는 방법은 무엇입니까?"크기"가 해결책입니까? (0) | 2023.07.09 |
시간 부분을 무시하고 T-SQL의 날짜 비교 (0) | 2023.07.09 |
16진수를 사용하여 Excel 셀의 뒤 색상을 변경하면 Excel이 스프레드시트에 완전히 다른 색상으로 표시됩니다. (0) | 2023.07.09 |