programing

EXISS 대 ISISS 절의 가입 및 사용

telecom 2023. 7. 9. 09:48
반응형

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를기로쿼가 있는 .bID는 같지만 유효하지 않은 레코드입니다.

이것은 사실 제가 직장에서 겪었던 생산 문제에서 비롯되었습니다.쿼리는 응용 프로그램 대신 쿼리에서 제외 로직의 대부분을 이동하여 로드 시간이 24초 이상에서 2초 미만으로 단축되었습니다. :-)

언급URL : https://stackoverflow.com/questions/7082449/exists-vs-join-and-use-of-exists-clause

반응형