728x90

LOUPOS님 | 튜닝/관리 | 2013-10-18 15:30:34


안녕하세요
최근 많은 도움을 받고 있습니다.
오늘 또 질문이 생겨서 작성해 봅니다.

관리 이슈가 생겨서 스키마 내의 전체 테이블에 대한 정보를 조사하는 중입니다.
레코드수, 사용용량 등등...

때문에 해당 데이터를 조회하고 있는데요

SELECT  B.TABSCHEMA, B.TABNAME, ROWS, COLCOUNT, DATA_MB, IDX_MB
FROM    (
          SELECT  TABNAME, CARD ROWS, COLCOUNT
          FROM    SYSCAT.TABLES 
          WHERE   TABSCHEMA = 'SPAMUSER'
        ) A,
        (
          SELECT  TABSCHEMA, TABNAME, 
                  SUM(DATA_OBJECT_P_SIZE)/1024 DATA_MB,
                  SUM(INDEX_OBJECT_P_SIZE)/1024 IDX_MB
          FROM    SYSIBMADM.ADMINTABINFO 
          GROUP BY TABSCHEMA, TABNAME
        ) B
WHERE   A.TABNAME = B.TABNAME     
--and     A.TABNAME = 'DM_FURNISH_USE_COMP'
ORDER BY A.ROWS desc, B.DATA_MB desc

간단히 위와 같이 작성을 하였는데요

우선 질문드려 볼게요

1. CARD 가 레코드(Rows) 가 맞나요? 일단.. 테이블당 레코드가 수천만 레코드 라서 count 를 쓸수가 없어서.. 저걸 쓰고있는데 아무래도 이상합니다...
2. CARD 부분이 RUNSTAT를 수행해야 최신값으로 올라오는 것을 알고 있습니다. 그런데... 너무 이상한게요...
지금 테이블 올드 데이터 정리하면서 대량 삭제를 수행하고 있습니다... 그런데... CARD가... 삭제 전보다 증가했습니다.... 이럴수가 있나요?;;;
의심되는 부분은.. 사실.. 삭제 전에 뽑은 데이터는 RUNSTAT를 수행하지 않고 뽑았던지라.. 최신데이터 가 아니라서.. 이럴수 있다고 생각은 들지만....
통계를 영 잘못 뽑고 있다는 생각이 가시질 않네요 ㅠ
3.  데이터 부분은 저렇게 뽑는게 맞지요? 다른 방법도 사용해봤는데 수치는 동일한걸로 보아 맞는 듯한데... 역시나 2번같은 문제가 발생하고 있습니다 ㅠ


몇가지 다른 예문

SELECT    row_number()  over(partition by tabschema order by tabschema ,TABNAME ), tabschema, 
      TABNAME ,to_char(create_time,'yyyymmdd') create_date, CARD ROWS, REMARKS 
FROM SYSCAT.TABLES 
WHERE   TABSCHEMA = 'SPAMUSER'
order by rows desc


SELECT TABSCHEMA, TABNAME, SUM(DATA_OBJECT_P_SIZE),
SUM(INDEX_OBJECT_P_SIZE), SUM(LONG_OBJECT_P_SIZE),
SUM(LOB_OBJECT_P_SIZE), SUM(XML_OBJECT_P_SIZE)
FROM SYSIBMADM.ADMINTABINFO GROUP BY TABSCHEMA, TABNAME

SELECT TABSCHEMA
  ,TABNAME
  ,(SUM(DATA_OBJECT_P_SIZE)+SUM(LONG_OBJECT_P_SIZE)
  +SUM(LOB_OBJECT_P_SIZE)+SUM(XML_OBJECT_P_SIZE))/1024 AS TABLE_MB_SIZE
FROM TABLE(SYSPROC.ADMIN_GET_TAB_INFO_V97('SPAMUSER', 'DM_SEND_COMP'))
GROUP BY TABSCHEMA, TABNAME
WITH UR;


공부가 많이 되기는 하는데... 참... 노력이 필요하네요...ㅋㅋㅋ




pajama 2013-10-18 23:54:26
1. 말씀하신대로 CARD가 테이블 레코드수입니다.

2. RUNSTATS를 실행한 이후에만 CARD값이 업데이트 됩니다.

3. 통계갱신일자가 최근일자라면 신뢰할수 있습니다.

통계갱신을 얼마나 자주해주는지가 관건일텐데요
테이블이 커서 통계갱신이 부담되신다면 샘플링하는 것도 방법입니다.
참고로 전체 데이터 일부를 샘플링하여 통계갱신하는 방법으로 통계갱신 성능을 향상시킬 수 있습니다.
runstats on table optim.acc1830 and sampled detailed indexes all tablesample system (10) -- 10% 데이터건수 샘플링
runstats on table db2inst1.employee and sampled detailed indexes all tablesample system (10) -- 10% 데이터페이지 샘플링

http://www.ibm.com/developerworks/data/library/techarticle/dm-0412pay/

LOUPOS 2013-10-21 23:25:52
답변 감사합니다~

냉정과열정사이. 2013-10-24 17:28:31
샘플링은 말 그대로 샘플링이기 때문에 오차가 발생할 수 있습니다.

Automatic으로 RUNSTAT을 수행하게 되면 해당 테이블의 UDI 카운트가 임계치를 넘어서게 되면(v8에서 15%였나 였던 것 같습니다.)

샘플링으로 runstats을 수행하기 때문에 오차가 있을 수 있습니다.

안하는 것보다 매우 좋겠지만 완전히 정확하냐고 물으시면 글쎄요...라고 생각합니다.



728x90

+ Recent posts