self join 시. 0 3 2,157

by 한번사는인생 [SQLServer] [2023.10.25 15:58:19]


A라는 테이블을 LEFT OUTER JOIN을 합니다.

SELECT *
FROM A AS A                            -- 자식.
    LEFT OUTER JOIN A AS B            -- 부모.
    ON 조인키
WHERE A.[Name] LIKE '%키워드%'
    OR B.[Name] LIKE '%키워드%'
    
실행계획을 보니, 테이블을 두번 스캔을 하는거 같습니다.
이럴때 한번만 스캔해서 데이터를 가져오는 방법이 없을까 문의 드립니다.
OR B.[Name] LIKE '%키워드%' => 이 조건이 없으면 1초에 나오는데,
해당 조건이 들어가면 2초이상 걸리더라구요.

by 마농 [2023.10.25 17:54:21]

2번 읽어서 느린게 아니라
아우터 조인인데다가, OR 조건인데다가, % 조건이라서 느릴 듯 합니다.
안좋은 조건들은 두루두루 다 갖췄네요.
차라리 UNION 으로 풀어 보는 것은 어떨지요.
 

SELECT a.*
  FROM a
 WHERE a.name LIKE '%키워드%'
 UNION
SELECT a.*
  FROM a
 INNER JOIN a b
    ON 조인키
 WHERE b.name LIKE '%키워드%'
;

 


by 한번사는인생 [2023.10.26 09:13:24]

테스트 해봤는데, 속도적인 측면에서는 비슷하거나 알려주신 방법이 조금 빠른 것 같습니다.

다양한 시각으로 보는 방법을 배웠습니다. 고맙습니다.


by 마농 [2023.10.26 10:04:21]
-- UNION 제거 --> UNION ALL
SELECT a.*
  FROM a
 WHERE a.name LIKE '%키워드%'
 UNION ALL
SELECT a.*
  FROM a
 INNER JOIN a b
    ON 조인키
 WHERE b.name LIKE '%키워드%'
   AND a.name NOT LIKE '%키워드%'
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입