서버 개발/프로그래머를 위한 RDBMS

아크 모델(exclusive or)에서의 주의점

지노윈 2020. 5. 27. 09:58
반응형

다음과 같은 모델을 아크라고 하며 exclusive or 관계 입니다.

select A.missionno, 
	case A.owner_flag 
		when 1 then B.name 
		when 2 then C.guildname 
	end name
from missions A, [user] B, guild C
where A.quest_id = 1
and ((A.owner_flag = 1 and A.userno = B.userno) or (A.owner_flag = 2 and A.guildno = C.guildno))

이 SQL을 실행하니 희안하게도 같은 이름이 복사가 되어 보여 집니다.

옆사람에게 물으니, "에이~ 이런 것도 모르세요? distinct 있자나요~"

그래서 신기하게도 distinct 하나만 붙여주니 원하는 결과가 나오니까 그냥 넘어 갑니다.

 

왜 이렇게 같은 것이 복제가 되었을 까요?

 

(A.owner_flag = 1 and A.userno = B.userno)를 보면 A, B 테이블만 조인을 했지 C 테이블은 JOIN하지 않았습니다. (A.owner_flag = 2 and A.guildno = C.guildno) 이 것도 비슷하고요.

그럼 당연히 C테이블의 row 수만큼 복제가 됩니다. guild가 100개 있으므로 100배만큼 결과가 복사가 된 것이지요.

이렇게 개발 완료하고 서비스 들어 갔다고 생각하면 아찔하죠. 길드가 늘어 나면서 시스템은 점점 느려지죠. 길드 1만개면 어떤 일이 벌어 지는지 상상만 해도 끔찍합니다.

 

그럼 어떻게 해야 하죠?

결과를 얻고자 하는 것이 연관이 없으므로 세 테이블을 한 번에 join 하지 말고 A, B 조인 결과과 A, C 조인 결과를 union 해서 결과를 보여 줄 수 있습니다.

 

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 게임 서버 프로그래머가 알아야 할 RDBMS

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 옵티마이저 맛보기

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 테이블 조인 하면 느리다?

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 리커시브 모델의 활용

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 아크 모델(exclusive or)에서의 주의점

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 부분범위 처리와 전체 범위처리

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 인덱스의 제대 사용하자

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - DB 옵티마이저

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - Nested Loop/Sort Merge/Hash Join

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - DB 테이블 클러스터링 팩터

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - DB 절차적 사고 VS 집합적 사고

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - SQL 집합의 가공

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - SQL IN의 특징과 IN의 활용

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 서브 쿼리 활용

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 인라인 뷰의 활용