2014년 8월 23일 토요일

DBMS_ROWID.ROWID_BLOCK_NUMBER,ROWID_RELATIVE_FNO 패키지함수를 이용하여 테이블이 몇개의 블록을 사용중인지 확인하는 방법​

DBMS_ROWID.ROWID_BLOCK_NUMBER,ROWID_RELATIVE_FNO 패키지함수를 이용하여 테이블이 몇개의 블록을 사용중인지 확인하는 방법

테이블이 몇개의 블록을 사용중인지 확인하는 방법인하는 방법각각의 테이블의 행(로우, ROW)은 의사 컬럼인 rowid를 가지고 있습니다 rowid에는 그 Rows의 물리적인 위치정보를 포함하고 있는데 파일번호블록번호블록내 행 번호와 같은 정보를 포함하고 있습니다.
:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 
하나의 데이터파일을 가지는 테이블스페이스에 테이블 데이터가 저장 되면 이 테이블의
ROWID는 유일한 블록번호(즉 하나의 테이블의 행들이 같은 블록 번호를 중복해서 가지지않는다는 의미)를 가지는 반면에 둘 이상의 데이터파일로 구성되는 테이블스페이스인 경우에 테이블에 데이터가 저장 되면 동일한 블록번호(서로 다른 파일에 각각의 블록 번호가 부여 되므로)를 가질 수 있습니다이러한 경우엔 블록번호와 파일번호 두 개의 항목을 조합하여 ROWID로부터 유일한 번호를 얻어 낼 수 있습니다.
 
즉 테이블이 몇 개의 블록으로 구성 되어 있는지는 이러한 점을 이용하여 구하면 되는데DBMS_ROWID라는 패키지를 이용하여 rowid에서 특정 값(파일번호블록번호등)을 얻어 낼 수 있습니다.
 
Rowid를 조회 하면 다음과 같습니다.
 
SQL> select rowid, jumin, name from addrbook;
rowed                            JUMIN      NAME
------------------ -------------- ------------
AAAJMZAABAAAPEKAAA 111111-2222222    
:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />홍길동

AAAJMZAABAAAPEKAAB 333333-4444444    
가길동
AAAJMZAABAAAPEKAAC 111111-2222222    
홍길동
 
다음과 같이 유일한 블록의 개수(테이블이 몇 개의 블록으로 구성되어 있는지)를 카운팅 할 수 있습니다.
 
SQL> SELECT COUNT ( DISTINCT
  2           DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)
  3           ||
  4           DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)
  5         ) "Used"
  6  FROM scott.emp;
 
      Used
----------
         2
 
 
또는 다음과 같은 방법도 가능 합니다.
 
SQL> SELECT COUNT (DISTINCT SUBSTR(rowid,1,15)) "Used"
  2  FROM scott.emp;
 
      Used
----------
         2


댓글 없음:

댓글 쓰기