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 39103 게시물 읽기
No. 39103
쿼리 속도 개선 좀 부탁합니다.
작성자
박진경
작성일
2011-11-16 13:37ⓒ
2011-11-16 15:21ⓜ
조회수
4,991

-- STATIC ( 집계 )
select id
     , stand_date
     , rnum
from  TB_STATIC

index1( stand_date )
index2( id, stand_date )
-----------------------------        
-- SYSTEM ( 시스템  )
select id
     , parent_id
from TB_SYSTEM
 
pk     : id ( PK )    

index3( parent_id)

=========================================

테이블이 위와 같이 두개로 구성되어 있습니다.
tb_static 에 2개월치 데이터를 조회합니다.

select count(*)
from TB_STATIC
where 1=1
and   stand_date between to_date(to_char(sysdate-61, 'yyyymmdd')||'000000', 'yyyymmddhh24miss') and  to_date(to_char(sysdate, 'yyyymmdd')||'235959', 'yyyymmddhh24miss')

-- 결과 건수 : 1,724,587 건
----------------------------------------

select * from TB_SYSTEM
where parent_id = '1001'

-- 결과 건수 : 400 건
----------------------------

select /*+INDEX(TB_STATIC index2)*/
     count(*) over() cnt
     , a.id
     , to_char(a.stand_date, 'yyyymmdd')
     --, max(a.rnum) value     <-------- (1)
from TB_STATIC a
   , TB_SYSTEM b
where a.id = b.id
and   b.parent_id = '1001'
and   a.stand_date between to_date(to_char(sysdate-61, 'yyyymmdd')||'000000', 'yyyymmddhh24miss') and  to_date(to_char(sysdate, 'yyyymmdd')||'235959', 'yyyymmddhh24miss')
group by a.id, to_char(stand_date, 'yyyymmdd')


-- 결과 건수 :  6,200 건( 20 ~ 30 초 )

===================================

위와 같이 6,200 건을 가져오는데 20 초 넘게 걸립니다.
더욱이 <---- (1) 주석을 풀면 30초 이상이 걸립니다.

속도를 개선하려면 어떻게 해야 하나요?

참 플렌을 떠보면 TB_SYSTEM의 index3을 먼저 타고 TB_STATIC 의 index2 를 탑니다.
 

 

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

 tb_static 의 index2 의 Clustering factor 가 매우 나쁠 것으로 보입니다.

즉, ID + stand_date로 조인이 들어오나 실제로 데이터는 ID순이 아닌 발생일자(stand_date) 순으로 쌓여있을 것으로 추정되네요. (rnum 넣기 전에 20초 걸리던게 30초 걸리는 이유는 이것 때문이죠.) table 로의 random access 를 없애기 위해  index2를 id, stand_date, rnum 으로 결합인덱스를 변경하는 방안이 가능하시면 시도해보시기 바랍니다. 

이러면 index only scan이므로 table 로의 random access i/o가 발생하지 않을겁니다.

보다 근본적으로는 파티셔닝이나 IOT등도 검토하여 보시기 바랍니다. (물론 잘못 적용하면 더 상황이 악화될 수도 있으니 항상 ID로 조회가 이루어지는지 Transaction의 빈도가 많은지등 종합적 검토가 필요하겠죠.)

아무거나님이 2011-11-17 17:12에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
39106Locking 메커니즘에 대한 질문 [1]
oracle
2011-11-17
4295
39105[질문] 오라클에도 DB Profiler 같은게 있나요?
궁금이
2011-11-17
3682
39104조회만 하는 Stored Procedure 작성 예제 좀.. [1]
궁금이
2011-11-16
4647
39103쿼리 속도 개선 좀 부탁합니다. [1]
박진경
2011-11-16
4991
39102어떻게 하면 될까요? [1]
???
2011-11-16
3610
39101계층적데이터 산출!! 도와주세요~~ [1]
박용선
2011-11-16
4197
39100테이블 관련 많이 부끄러운 질문 입니다. [1]
안준용
2011-11-15
4645
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다