개요
메모리 테이블의 데이타 사용량 과 인덱스 사용량을 조회하는 쿼리를 설명합니다.
메모리테이블 데이타 사용량 조회쿼리
다음의 쿼리는 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
;
출력예시