2014년 4월 4일 금요일

[오라클튜닝, 행이행,체인로우]Chained Row 찾기 및 대처 방법 [오라클개발자교육/오라클/ORACLE강좌/오라클교육잘하는곳/오라클교육추천/ORACLE실무교육/ORACLE/ORACLE교육/ORACLE학원/오라클실무교육]

[오라클튜닝, 행이행,체인로우]Chained Row 찾기 및 대처 방법 [오라클개발자교육/오라클/ORACLE강좌/오라클교육잘하는곳/오라클교육추천/ORACLE실무교육/ORACLE/ORACLE교육/ORACLE학원/오라클실무교육]
 

chained row를 찾아 이를 관리하는 것은 DBA,의 중요한 부분중 하나 입니다. 오라클은 로우가 확장될때(예르들면 주소 항목을 "서울" 이라고 한 후 나중에 이를 "서울시 강남구 역삼동" 이라고 하는 경우) multiple data block에 체이닝 될수도 있으므로(대부분 하나의 row는 하나의 블럭에 위치하는 것이 좋겠져^^) , 이 경우 결국 검색시 DISK IO를 증가시키게 되어 성능에 좋지 못한 결과를 초래할 수 있습니다.

물론 row chaing은 PCTFREE를 톺게 setting 함으로서 추후 데이터 ROW의 변경되어 사이즈가 커지는 것에 대비할 수도 있겠지만 데이터 TYPE이 RAW or LONG RAW인 경우 row chaing은 어쩔수 없이 발생될수도 있습니다. 왜냐면 한 로우의 사이즈가 블럭 사이즈보다 크면 당연히 다른 블럭에 데이터를 기록해야 겠죠... 그래서 아래 Query에서 RAW 또는 LONG RAW 컬럼은 제외 하였습니다.

물론 아래의 Query를 실행하기전에 ANALYZE 명령을 실행하여 테이블에 대한 통계 정보(chain_cnt and num_rows columns of the DBA_TABLES)를 생성해야 합니다.

아래의 쿼리를 통해 row chaining이 확이되면 Create Table As Select (CTAS) 또는 Oracle export-import utilities를 통해 다시 테이블을 생성시키는 것이 좋습니다.


select
  owner              "Owner",
  table_name        "Table",
  pct_free          "PCTFREE",
  pct_used          "PCTUSED",
  avg_row_len        "avg row",
  num_rows          "Num Rows",
  chain_cnt          "Chains",
  chain_cnt/num_rows Pct
from  dba_tables
where owner not in ('SYS','SYSTEM')
and  table_name not in
      (
          select table_name
          from  dba_tab_columns
      where  data_type in ('RAW','LONG RAW')
      )
and  chain_cnt > 0
order by chain_cnt desc 

댓글 없음:

댓글 쓰기