데이터 조회 성능 문의 0 2 1,088

by 최지용 [SQL Query] [2012.10.29 17:05:04]


안녕하세요 쿼리 조회를 하는데 이해 안되는 부분이 있어서 글 올립니다.

테이블 내역
기준테이블(10만건 정도) 200 byte
  인덱스 : 기준테이블_col1
조인테이블(2000만건 정도) 한로우 2500 byte
  인덱스 : 조인컬럼1

select * from 기준테이블, 조인테이블 where 조인컬럼1 = 조인컬럼 2 and 기준테이블_col = '111111';
입니다.

조회 하면 대략 3000건 정도가 나옵니다.
3000건 조회 하는데 속도가 1분이 넘게 걸립니다.

10046 트레이스를 떠보니 다음과 같이 나옵니다.

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch      627      1.55      50.80       5306      14069          0        3129
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total      629      1.55      50.80       5306      14069          0        3129


Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
      3129       3129       3129  NESTED LOOPS  (cr=14069 pr=5306 pw=0 time=46922555 us)
      3129       3129       3129   NESTED LOOPS  (cr=10775 pr=2352 pw=0 time=20957083 us cost=6 size=54 card=1)
      3129       3129       3129    TABLE ACCESS BY INDEX ROWID OR_ORDM (cr=3896 pr=133 pw=0 time=4242002 us cost=4 size=14 card=1)
      3129       3129       3129     INDEX RANGE SCAN SYS_C0012322 (cr=640 pr=14 pw=0 time=30901 us cost=2 size=0 card=2)(object id 74357)
      3129       3129       3129    INDEX UNIQUE SCAN SYS_C0012346 (cr=6879 pr=2219 pw=0 time=20540450 us cost=1 size=0 card=1)(object id 74380)
      3129       3129       3129   TABLE ACCESS BY INDEX ROWID OR_ORDD (cr=3294 pr=2954 pw=0 time=29253512 us cost=2 size=40card=1)

Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                      627        0.00          0.00
  Disk file operations I/O                                39        0.00          0.00
  gc cr grant 2-way                                     2572        0.09          1.46
  db file sequential read                            5306        0.12         47.67
  SQL*Net message from client                 627        2.66          3.49
  gc current block 2-way                              443        0.04          0.31
  latch: gc element                                           8        0.00          0.00
  gc cr grant congested                                  5        0.00          0.00
  gc current block congested                          2        0.00          0.00
  latch free                                                         1        0.00          0.00


처리를 할수 있는 방법이 있는지 궁금합니다.
by 이재현 [2012.10.29 17:56:28]
트래이스면 실제 계획( ? )을 보여주셔야 알죠 ㅡㅡ

by 제로 [2012.10.29 23:52:23]
위와 같이 쿼리를 작성했을 경우 현재 상황에서 nested loop조인이 최적일 것 같습니다.
merge 조인의 경우 sort의 부하가 클것 같고 hash조인 역시 cpu, memory부하가 클것 같아 보이네요.
실행계획을 보니 오라클 11g 인것 같네요.
현재 위 정보에서 10046트레이스에 보면 총 건수는 3129건 이고 
block count가(logical + physical) 14069 네요. 
physical 블락을 5306건 읽었지만 위 쿼리의 경우 1분까지는 안걸릴 듯 합니다.(제 생각입니다.^^;)
근데 위 10046 트레이스를 보면 총 3129건을 가지고 오는데 fetch 횟수가 627회 이네요.
fetch call에 의한 성능 저하 현상으로 보입니다.
1회 fetch 시 block read count = 3129/627
                                           = 4.9904
                                           = 약 5 block
따라서, arraysize 를 늘려서 쿼리 해보시면 좋을 듯 합니다. 
sqlplus 경우  set arraysize 1000 이라 하면 되겠네요.
# 참고사항
 - Select List절에 * 가 아닌 반드시 필요한 컬럼만을 기입하는 것이 좋습니다.
 - 부분범위 처리가 가능한지 확인하면 좋겠네요~
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입