SELECT pa.patientid, st.studyid, st.studydate, se.seriesnumber, im.sopinstanceuid, im.sopclassuid,
im.imagewidth, im.imageheight, im.windowcenter , im.windowwidth, im.desc1, im.desc2, im.annotationdescription , im.filter, im.filename
FROM patientlevel pa, studylevel st, serieslevel se, imagelevel im
WHERE pa.patientid='428578'
AND pa.patientid = st.patientparent_key
AND st.studyinstanceuid = se.studyparent_key
AND se.seriesinstanceuid = im.seriesparent_key
위와 같은 쿼리가 있습니다.
구조는 patientlevel > studylevel > serieslevel > imagelevel
순으로 조인이 되는 구조 이고,
imagelevel 은 1000만건 정도 데이터가 있고,
나머지는 100만건 이내로 데이터가 있습니다.(피라미드 구조~ ^^)
어제 저녁
각 테이블을 vacuum analyze 를 돌렸습니다. 이후,
갑자기 쿼리가 느려져서,
explain 을 했더니
Sort (cost=2016313.19..2016316.18 rows=1197 width=522) (actual time=896510.838..896511.046 rows=369 loops=1)
Sort Key: st.studydate, se.seriesnumber, im.imagenumber
-> Hash Join (cost=31111.52..2016251.99 rows=1197 width=522) (actual time=23139.313..896506.779 rows=369 loops=1)
Hash Cond: (("outer".seriesparent_key)::text = ("inner".seriesinstanceuid)::text)
-> Seq Scan on imagelevel im (cost=0.00..1952962.00 rows=6433300 width=360) (actual time=22028.013..888457.315 rows=6723501 loops=1)
-> Hash (cost=31110.99..31110.99 rows=215 width=215) (actual time=591.677..591.677 rows=0 loops=1)
-> Nested Loop (cost=0.00..31110.99 rows=215 width=215) (actual time=41.263..591.541 rows=31 loops=1)
-> Nested Loop (cost=0.00..517.45 rows=135 width=144) (actual time=14.431..168.219 rows=20 loops=1)
-> Index Scan using patient_idx on patientlevel pa (cost=0.00..5.41 rows=1 width=36) (actual time=0.058..0.063 rows=1 loops=1)
Index Cond: ((patientid)::text = '428578'::text)
-> Index Scan using sl_patientid on studylevel st (cost=0.00..510.69 rows=135 width=118) (actual time=14.348..167.895 rows=20 loops=1)
Index Cond: ((patientparent_key)::text = '428578'::text)
-> Index Scan using srl_uid on serieslevel se (cost=0.00..225.46 rows=93 width=127) (actual time=20.677..21.144 rows=2 loops=20)
Index Cond: (("outer".studyinstanceuid)::text = (se.studyparent_key)::text)
Total runtime: 896511.606 ms
imagelevel 부분을 seq 스캔을 하는데, 어떻게 해야 하나요??
imagelevel에 있는 seriesparent_key 와 조인하는 serieslevel 의 seriesinstanceuid 모두 인덱스는 걸려 있습니다. ㅠ
제 머리로 해볼수 있는 부분들은 모두 시도해보았는데,, 휴,, 전혀 답이 안나와서, 이렇게 문의 드려 봅니다~
고수 선생님들의 지도 부탁드리며, 긴글 읽어주셔서 감사드립니다.
참고로 DB버전은 8.0.3, CentOS 4.4 에서 구동중에 있습니다.
|