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