database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 38878 게시물 읽기
No. 38878
group by 속도문제
작성자
유은정(yu7476)
작성일
2011-09-19 16:45
조회수
12,252

쿼리작업을 하면서 항상 궁금해하면서도 막상 네이버나, 구글같은곳에서 답을 찾아봐도 딱 원하는 답도 없고.....

꼭 좀 도와주세요.....

아주 단순한 질문이고, 기초적인 질문같은데 여전히 저는 답을 못찾고있네요...

group by 만 걸면 속도가 안나옵니다 ㅠㅠ

아주 단순한 쿼리로...

SELECT CODE_1

   FROM TMP_TABLE

 WHERE START_DATE BETWEEN '20110101' AND '20110131'

 GROUP BY CODE_1

 

위 쿼리에서 GROUP BY 절만 빼만 순식간에 답이 나오는데,

GROUP BY 절만 추가하면 6분 이상 걸립니다. ㅠㅠ

참고로 CODE_1 키를 가지고있는 인덱스는 생성되어있습니다.

 

궁금한건.....

왜 GROUP BY 만 하면 속도가 느려질까요?

이 부분을 해결할수 있는 방법은 없을까요?

오라클 11G 입니다...

아... 너무 궁금하네요... 부탁드립니다.

 

 

이 글에 대한 댓글이 총 2건 있습니다.

start_date에 인덱스가 있는지 모르겠습니다만,

없다면 풀 테이블 스캔을 하게 됩니다. 풀테이블 스캔시에 읽혀지는 row부터 특정갯수의 row가 읽혀지면 읽혀진것부터 화면에 뿌리게 되구요..

흔히 토드나 오렌지에서 빨리 읽혀지는 것처럼 '보이는' 것은 먼저 읽혀진 row부터 화면에 뿌려주기 때문에 '체감상' 그렇게 보입니다(기본이 10개 단위던가...). 전체 row를 다 읽는다면 group by 해서 읽는 속도랑 비슷하게 느껴질겁니다.

group by를 하게 되면 일단 테이블을 다 읽어야 하고, 그 다음에야 group by를 하게 됩니다. 그러니 '테이블 다 읽는 시간'+group by 를 하게 되니 체감상 훨씬 늦게 나타나는 것처럼 보이게 됩니다.

또 한가지 가능성은 start_date에 인덱스가 있는 경우 그냥 읽을 경우엔 start_date의 인덱스를 이용하여 index_range_scan을 수행하나 group by로 인해 plan이 변경될 수도 있습니다(흔한 경우는 아니지만 잘못된 통계정보로 인한 오류로 그럴수 있고, 옵티마이저가 group by의 cost를 높게 책정할 경우 변경될 가능성이 있습니다. start_date에 인덱스가 없는 경우라도 group by로 인해 code_1의 인덱스를 full scan할 수도 있겠네요...). 자세한건 플랜을 봐야 알수 있습니다.

이런 경우라면 통계정보를 새로 생성하거나, 인덱스 힌트를 추가하여 바로 잡을 수 있습니다.

 

먼저 두가지 경우의 PLAN을 보시고 변경여부를 확인해보시기 바랍니다. 

viatoris님이 2011-09-20 09:41에 작성한 댓글입니다. Edit

group by의 경우 전체 범위 처리를 하게 됩니다.

즉 해당 table을 full로 스캔한 후 운반 단위를 만들어 데이터를 이동하여 화면에 뿌리게 되죠...

실행계획을 봐야 알겠지만.. 제 생각에 code_1에 index가 있다고 하더라도... 그 인덱스가 적용되어 실행되는지도 봐야 할거 같구요...

그렇지 않다면... hint로 강제 적용이 가능합니다.

제 생각에 데이터 분포도는 확실히 모르지만... code_1+start_Date 의 복합 인덱스를 생성하여 실행계획 분석 후 performance 를 분석해 보심도 어떻지요... ^^;;

인덱스 테이블만의 스캔은 일반 테이블을 full scan 하는 것보다 비용적인 측면이나 i/o 측면에서 유리 합니다. 인덱스 테이블의 사이즈가 일반 테이블보다 작기 때문이죠...

참조 바랍니다.

나그네님이 2011-09-22 08:35에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
38881기초질문입니다^^ [5]
임서희
2011-09-19
4028
38880트리거를 이용하여 테이블 자료를 txt로 저장... [1]
이종민
2011-09-19
3619
38879서브쿼리 에러...... [1]
MO
2011-09-19
4709
38878group by 속도문제 [2]
유은정
2011-09-19
12252
38877백업질문 [1]
오라클초보임
2011-09-19
3321
38873합게 / 비율을 동시에.. [1]
우라질백기사
2011-09-19
4117
38870SQL query중 JOIN관련질문 드립니다.
오라클초보임
2011-09-18
3158
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다