Skip to end of metadata
Go to start of metadata

 

개요

메모리 테이블의  데이타 사용량 과  인덱스 사용량을 조회하는 쿼리를 설명합니다.

메모리테이블  데이타 사용량 조회쿼리

다음의 쿼리는  HDB 4.3.9.x  부터 HDB 6.3.1.x 까지 모든 버전에서 사용할 수 있습니다.

set linesize 2048;
set colsize 30;
SELECT   a.user_name
        ,NVL(d.name,'SYS_TBS_MEMORY')  AS 'TABLESPACE_NAME'
        , b.table_name
        , round((c.fixed_alloc_mem + c.var_alloc_mem)/(1024*1024),2) 'ALLOC(M)'
        , round((c.fixed_used_mem + c.var_used_mem)/(1024*1024),2) 'USED(M)'
        , round((c.fixed_used_mem + c.var_used_mem)/(c.fixed_alloc_mem + c.var_alloc_mem)*100,2) 'EFFICIENCY(%)'
FROM   system_.sys_users_ a
     , system_.sys_tables_ b
     , v$memtbl_info c left outer join v$tablespaces d  on c.tablespace_id = d.id
WHERE  b.table_type = 'T'
  and a.user_id = b.user_id
  and b.table_oid = c.table_oid
order by 1,2,3, 4 desc ;
출력예시

 

메모리테이블 인덱스 사용량 조회

메모리테이블의 인덱스 사용량은  쿼리로  직접 구할 수 없습니다   알티베이스 메모리테이블은  인덱스 칼럼의 갯수와 타입에 상관없이  인덱스당 16byte 크기를 갖으며  인덱스 사용량은  16byte * 레코드 건수로 계산할 수 있습니다.

.

메모리테이블 인덱스 정보 구하는 쿼리 ( HDB 4 ~ HDB 6 까지 모두 사용 가능 )

다음의 쿼리로 테이블별 인덱스 정보를 확인할 수 있습니다 .  인덱스 크기확인은  레코드 건수를 확인후  따로 계산하거나   function 이 들어간    메모리 테이블 인덱스 크기 구하는 쿼리를 사용해야 합니다.

set linesize 2048;
set colsize 30;

 SELECT
        c.user_name
        , decode(f.table_type, 'Q', 'QUEUE', 'T', 'TABLE') object_type
        , table_name object_name
        , e.index_name
        , rpad(case2(e.index_type=1, 'b-tree', 'r-tree'),10,' ') index_type
        , '16 bytes * rowcount' 'ALLOC'
 FROM      v$memtbl_info a
        ,  v$index b
        , system_.sys_users_ c
        , system_.sys_indices_ e
        , system_.sys_tables_ f
 WHERE
       a.table_oid = f.table_oid
   and b.index_id = e.index_id
   and e.user_id = c.user_id
   and f.user_id = e.user_id
   and f.tbs_id = a.tablespace_id
   and f.table_oid = b.table_oid
   and c.user_name <> 'SYSTEM_' ;
출력예시

 

메모리 테이블 인덱스당 사용량 구하는 쿼리 ( HDB 5.x  이상부터 사용가능)

 

다음의 쿼리를 사용하여 메모리테이블의  인덱스당 사용량을 구할 수 있습니다.    쿼리를 사용하기 전에 해당 테이블을 레코드 건수를 구할 수 있는  DB function 을 생성해야 합니다. 

1. 테이블의 레코드 건수를 count 할 수 있는 function 을 생성합니다.
CREATE FUNCTION GETCOUNT(u_name varchar(40), t_name varchar(40))
 RETURN INTEGER
 AS
    RECORDCOUNT integer;
BEGIN
       EXECUTE IMMEDIATE 'SELECT count(*)  FROM ' || u_name||'.'||t_name INTO RECORDCOUNT ;
RETURN RECORDCOUNT;

END;

/


2. function 을 이용하여  인덱스당 사용량을 조회합니다.
set linesize 2048;
set colsize 30;
SELECT
        c.user_name
        , decode(f.table_type, 'Q', 'QUEUE', 'T', 'TABLE') object_type
        , table_name object_name
        , e.index_name
        , rpad(case2(e.index_type=1, 'b-tree', 'r-tree'),10,' ') index_type
        , ROUND( 16 * GETCOUNT(c.user_name, f.table_name) / 1024/1024, 2)  'ALLOC(M)'
 FROM      v$memtbl_info a
        ,  v$index b
        , system_.sys_users_ c
        , system_.sys_indices_ e
        , system_.sys_tables_ f
 WHERE
       a.table_oid = f.table_oid
   and b.index_id = e.index_id
   and e.user_id = c.user_id
   and f.user_id = e.user_id
   and f.tbs_id = a.tablespace_id
   and f.table_oid = b.table_oid
   and c.user_name <> 'SYSTEM_' ; 
출력예시

 

메모리 테이블당 총인덱스 사용량 구하는 쿼리 (  HDB 5.x 이상부터 사용가능 )

메모리 테이블이 사용하는 테이블당 총 인덱스 사용량을  조회합니다.  쿼리를 사용하기 전에 해당 테이블을 레코드 건수를 구할 수 있는 DB function 을 생성해야 합니다.

1. 테이블의 레코드 건수를 count 할 수 있는 function 을 생성합니다.
CREATE FUNCTION GETCOUNT(u_name varchar(40), t_name varchar(40))
 RETURN INTEGER
 AS
    RECORDCOUNT integer;
BEGIN
       EXECUTE IMMEDIATE 'SELECT count(*)  FROM ' || u_name||'.'||t_name INTO RECORDCOUNT ;
RETURN RECORDCOUNT;

END;

/


2. function을 사용하여  테이블당 총 인덱스 사용량 크기를 조회합니다.
select
          user_name
        , table_name
        , count(index_name) AS 'INDEX_COUNT'
        , round( SUM(alloc) /1024/1024, 2 ) as 'Alloc(M)'
from (
         SELECT
                  c.user_name
                , f.table_name
                , e.index_name
                , 16 * GETCOUNT(c.user_name, f.table_name) AS alloc
         FROM      v$memtbl_info a
                ,  v$index b
                , system_.sys_users_ c
                , system_.sys_indices_ e
                , system_.sys_tables_ f
         WHERE
               a.table_oid = f.table_oid
           and b.index_id = e.index_id
           and e.user_id = c.user_id
           and f.user_id = e.user_id
           and f.tbs_id = a.tablespace_id
           and f.table_oid = b.table_oid
           and c.user_name <> 'SYSTEM_'
     )
 group by user_name, table_name;           
출력예시

 

메모리테이블 인덱스당 크기 조회 쿼리(  6.x 용 )

다음의 쿼리로 좀더 정확한 메모리테이블의  인덱스당 사용량을  조회할 수 있습니다.   6.1.1  이상 버전에서 사용할 수 있습니다.    

 

SELECT U.USER_NAME, T.TABLE_NAME TABLE_NAME
     , B.INDEX_NAME
     , LPAD(I.IS_PARTITIONED, 14) INDEX_PARTITIONED
     , ROUND(((USED_NODE_COUNT+ PREPARE_NODE_COUNT) / 15 * 32768)/1024/1024, 1) AS 'SIZE(MB)'
  FROM V$MEM_BTREE_HEADER B
     , SYSTEM_.SYS_INDICES_ I
     , SYSTEM_.SYS_TABLES_ T
     , SYSTEM_.SYS_USERS_ U
 WHERE 1=1
   AND B.INDEX_ID = I.INDEX_ID
   AND I.TABLE_ID = T.TABLE_ID
   AND B.INDEX_TBS_ID <> 0
   AND U.USER_ID = T.USER_ID
 ORDER BY TABLE_NAME, B.INDEX_ID
;
출력예시
  • No labels