1)
select idx,level from char_info where idx in (select no from user where no='298110' or no='4187793')
 
=> 원하는 것은 유저테이블의 no(pk) 가 298110  또는 4187793 인 레코드를 찾아서.. 캐릭터정보 테이블의 index(pk)
와 일치하는 유저 테이블 no를 찾는것...? 맞나???

2)
select idx,level from char_info where idx in ('298110','4187793')

저런 쿼리경우 서브 쿼리 해서 tmp 사용하시는것보단.. 그냥 아래쪽으로 쓰는게 빠르죠.. =>아마 임시 테이블 복사가(메모리) 
이뤄지는듯 하다.  string 작업 할때 += 연산 해줄때 퍼포먼스 떨어지는 것과 유사

아니면.. 

3)select idx,level from char_info a, (select no from user where no='298110' or no='4187793') <-인라인
쿼리...=메모리에 올린 사본 데이터 = 물리x 논리적 테이블 = 리절트셋 b 

하여튼 1 vs 3의 차이점은 in() 이라는 키워드 이고..
아래 답글들을 보면.. in()의 경우 해당 조건을 확인위해 테이블 로우 풀스캔(전체 조회)이 일어나는듯하다.


지훈형님이 말씀하신 쿼리 튜닝의 개념인듯하다.. 중요하니까 신경써야함..!!


어렵고도 어려운~  (아래는 ms sql 포럼.. 오라클 개발자 포럼도 찾아봐야할듯.. 나~중~에)

http://www.mysqlkorea.co.kr/gnuboard4/bbs/board.php?bo_table=community_03&wr_id=2917



아래는 오라클 개발자 포럼




selete 사용시 주의할점


(추가)
DB 테이블 최적화(설계단 문제) , 쿼리 최적화 또한.. 쉬운 분야가 아니다. 맛만 보았다. 


by givingsheart 2014. 1. 2. 09:01