티스토리 뷰

반응형

database 에서 두개의 테이블 사이에 데이터 검색 방법

쿼리를 다루다보면 두가지 테이블을 연관지어 데이터를 조회할 때가 있는데
PROGRAM_INFO 와 NEWS_01 테이블의 연관관계가 외래키 idx로 묶여있다면 프로그램이 가진 뉴스 콘텐츠를
쉽게 확인할 수 있을것이다.

-- SUBQUERY 방식
select *
from NEWS_01 a, PROGRAM_INFO b 
where (select count(join_key) from ATTACH where join_key=a.join_key)=0

-- JOIN 방식
select *
from NEWS_01 a join PROGRAM_INFO b ON a.m_cd=b.m_cd
where (SELECT COUNT(*) from NEWS_01 a right OUTER JOIN ATTACH b ON a.join_key=b.join_key WHERE b.join_key IS NULL)=0;

두 쿼리는 동일한 테이블을 생성해 내지만 우리는 쿼리의 특성을 확인해야한다.

SUBQUERY : 하위질의 / 중첩질문

본래 쿼리는 질문의 의미를 가지고 있다.
그런데 SUB이라는 접두사가 붙는다면 중첩 질문 으로 봐야한다.

즉, 질문안에 질문인데 사람이 연속적인 질문에 머리를 써야하듯 컴퓨터도 연산처리가 필요하다.

위 쿼리를 말로 옮긴다면 다음과 같이 되지 않을까?

PROGRAM 중에 NEWS 콘텐츠 중에 첨부파일이 없는 것을 보여줘

JOIN : 집합

우리가 join은 배울때 집합을 빼 놓을 수 없는데 실제 작동방식 또한 이와 비슷하기 때문이다.

위 쿼리를 말로 옮긴다면 다음과 같이 될 것이다.

PROGRAM과 NEWS의 데이터의 m_cd 교집합에서 NEWS과 ATTACH의 차집합인 것

정리

1만 개의 데이터를 대상으로 두 방식을 비교하면 SUBQUERY 는 1초 JOIN은 0.5초의 작업시간을 보여주었다.

정리하면 두 쿼리 모두 같은 목적을 가지지만 작동 방식에서 차이를 보이며 처리시간또한 큰 차이를 보여주었다.

SUBQUERY의 경우 적은 데이터 테이블에서 우수한 쿼리 속도를 보여주며
JOIN은 상대적으로 대량의 데이터에서 빠르게 작동했다.

만약 실무에서 게시판 혹은 외래키로 구성되어 있는 여러 테이블을 사용한다면 두 쿼리로 모두 작성해보고
좋은 결과를 보여주는 쿼리문으로 선택해야할 것이다.

CHAT_GPT의 의견

join문은 두 개 이상의 테이블을 연결하여 하나의 결과 집합을 생성합니다. 
이 방법은 데이터 양이 많고 인덱스가 적절하게 구성되어 있는 경우 매우 빠를 수 있습니다. 
join문은 일반적으로 데이터를 처리하는 데 필요한 시간이 적으므로 대규모 데이터베이스에서 자주 사용됩니다.

반면에 subquery는 하위 질의라고도 불리며, 다른 질의 결과를 필터링하거나 참조하는 방법입니다. 
subquery를 사용하면 중첩된 질의를 작성할 수 있으므로 데이터 양이 적은 경우 유용합니다. 
그러나 subquery는 데이터 양이 많아질수록 성능이 저하될 가능성이 있습니다. 
특히 subquery가 매우 복잡하거나 인덱스가 부적절하게 구성되어 있는 경우 이러한 문제가 발생할 수 있습니다.

서브 쿼리를 조인으로 대체할 수 없는 경우

1) GROUP BY 를 사용한 서브 쿼리가 FROM 절에 있을 때
2) 집계된 값을 반환하는 서브 쿼리가 WHERE 절에 있을 때
3) 서브 쿼리가 ALL 연산자에 있을 때

대체할 수 없는 위 3가지 공통점은 테이블 형식이 아닌 정수 혹은 참/거짓 처럼 단순 데이터라는 것이다.

join은 두 테이블 사이의 연관관계에서 집합을 찾아내는 구조이므로 테이블 형식이 아닌 위 방식들은 사용할 수 없는 것이다.

반응형

'DataBase' 카테고리의 다른 글

SphinxSE는 Join 쿼리를 지원하는가?  (2) 2024.07.05
[work 기록장] 반복되는 컬럼 개선  (0) 2023.06.16
스핑크스 SQL의 특징과 문제점  (0) 2022.10.18
Common Table Expression  (0) 2022.09.17
DB 암호화 기법  (1) 2022.09.16
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함