ORDER BY 위치에 따라서 속도차이가 납니다. 0 8 12,729

by 아카시아향기 [SQL Query] 서브쿼리 ORDER BY 정렬 서브쿼리 ORDER BY [2013.11.15 09:37:17]



이번에 쿼리를 짜는데 속도차이가 많이 나서 비슷한 형식의 쿼리를 만들어보았습니다.


1번 쿼리

SELECT  게시판.주민번호
  , 게시판.글번호
  , 게시판.일자
  , 게시판.직급
  , 게시판.부서
 FROM 게시판 , (SELECT 주민번호 , MAX(글번호)
  FROM 게시판
WHERE 주민번호 = '1111111111111'
  GROUP BY 주민번호, 일자, 집급, 부서
   ) 중복체크
 WHERE 게시판.주민번호 = 중복체크.주민번호
   AND 게시판.글번호 = 중복체크.글번호
ORDER BY 게시판.글번호, 게시판.부서



2번 쿼리

SELECT  게시판.주민번호
  , 게시판.글번호
  , 게시판.일자
  , 게시판.직급
  , 게시판.부서
 FROM 게시판 , (SELECT 주민번호 , MAX(글번호)
  FROM 게시판
WHERE 주민번호 = '1111111111111'
  GROUP BY 주민번호, 일자, 집급, 부서
  ORDER BY 글번호, 부서
   ) 중복체크
 WHERE 게시판.주민번호 = 중복체크.주민번호
   AND 게시판.글번호 = 중복체크.글번호


 

위와 같은 결과가 나왔고 건수가 많으면 속도가 현저히 떨어지는걸 볼수 있었습니다.

현재로서는 order by 위치에 따라서 속도차이가 나는데 1번 쿼리의 속도가 조회되는 건수가 많을수록 느립니다.

PK 는 주민번호 + 글번호 로 이루어져 있고

index는 주민번호 입니다.

1. 속도 차이가 나는 원인이 멀까요....

2. 공백에 따라서 위 두 쿼리의 정렬 순서의 차이가 나는데 왜 그런건가요?

by 부쉬맨 [2013.11.15 11:09:33]
이건 order by 순서의 문제가 아니라
orderby 가 어디에 있느냐 문제네요.

1번은 밖에서 order by 처리했으니깐
11111111이라는 주민번호의 대상이 게시판 중복체크로 인한 건수가 많으면 많을수록 대상이 많아져서 느림

2번은
11111111이라는 주민번호의 대상을 가지고 order by 해봤자 1건일꺼고 그걸가지고
밖에서 조인했으니깐 빠름

결론은 order by 대상이 몇건이냐...의 차이입니다.

by 아카시아향기 [2013.11.15 11:41:36]

답변 감사합니다.
그리고 한가지 더 궁금한게 있습니다.
게시글중에는 중복이 있을수도 있지만 그렇지 않은경우도 있을텐데
중복이 없는 경우에도 두 쿼리에 대해 속도차이가 발생합니다. 
(800건 정도 되는 결과값이 나오는데도 속도차이가 15초 이상 차이가 나기도 합니다.)


by 부쉬맨 [2013.11.15 17:41:27]
제가 잘못보았네요.
주민번호는 중복체크에서 다 하는군요
첫번째거는 없는건지알았습니다.

다시 설명해드리겠습니다
1번은 일단 데이터가 많으면 많아질수록 느려지는 이유는
게시판 테이블, 중복체크 테이블을 전체 데이터를 읽어서 조인하는 형태를 취하고있습니다.
이유는 중복체크부분에는 중복방지로인한 group by 가 들어가 전체테이블을 읽어들였구요.
그리고 밖에서는 순서 정렬로 인한 order by 로 전체테이블을 읽어들였습니다.
그리하여 중복체크에서 읽어서 대상건수(몇개만) 조인할려고 하는 목적에서 벗어났습니다.

2번은 1번과 다르게 중복체크부분에서 전체테이블을 읽어서 111111 이라는 사용자를 찾았습니다.
그 대상 주민번호만 읽은 중복체크는 전체 테이블을 읽음
그리고 밖에서 조인이 일어나면서 중복체크 테이블과 게시판을 조인시 
index uniq 인덱스를 타면서 대상 주민번호의 대상자만 가져오므로 
첫번째 테이블은 다 읽었지만 두번째 조인시에는 10개든 1개든 읽어서 처리해서
더빠른 속도를 가져옵니다.



플랜을 두개비교해서 보면 딱나오네요...

by 임상준 [2013.11.16 15:22:51]
1번 서브쿼리에 노머지 힌트 쓰거나 메인에 노 푸시 프레드 힌트인가 그거 쓰면 될듯요.. 뷰가 풀려서 조인하고 그룹바이를 하는듯

by 아카시아향기 [2013.11.19 16:03:44]

답변 감사합니다.


by 아발란체 [2013.11.15 11:43:20]
전문가가 아니라 명쾌한 답을 저도 듣고 싶은데... ㅋㅋ

답은 아니지만,
올려주신 질의가 자주 사용 되는 테이블이라면 키를 재구성 하시면 보다 빠른 속도를 기대 할 수 있을 것 같습니다.

근데 보실려는 결과가
특정 사용자에 대해 부서별 최근 게시물인가요?

by 아카시아향기 [2013.11.15 13:17:45]

위쪽에 예로든 쿼리는 간단하게 표현하려고 한거라서요.
실제로는 한사람의 경력을 보여주기 위한 쿼리인데요.
해당 기관 담당자가 일년에 한번 정도 일괄적으로 엑셀 업로드를 통해 자료 입력을 하다보니 중복된 데이터를 넣는 경우가 생겨서요.  
결과는 특정 사용자에 대한 전체 경력사항을 보여주려고 합니다.


by 필상 [2013.11.15 13:49:58]

저도 답이 궁금해서 들어왔다가...

제가 보기에는 조인방식에 따른 차이가 아닌가 싶은데요
1은 HASH과 2는 LOOP인데
원본 자료가 좀 되고 결과가 몇건 안되는 건이라는 2와 같이 LOOP조인이 맞을거 같아
이방향으로 질의를 유도하는게 방법이 아닐까 생각해 봅니다.(PK충족이 되니깐)

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