카이로스는 메모리 기반 디비라서 빠르다. 그런데 이 메모리가 스왑되면 일반 관계형데이타베이스와 다를것이 없어지므로 카이로스가 사용하는 메모리는 스왑되지 않도록 해주는 것이 좋으며 이를 핀 메모리(맞나?) 설정이라고한다.

우선 설정 파일( kairos.properties )을 열어서 핀 메모리 설정값이 on으로 되어있는지 확인한다. 아마도 되어있을것이다.

su - (root 권한이 필요하다)

ln-s libcci.so /usr/lib64/libcci.so

카이로스 실행 파일이 있는 디렉토리로 가서 소유자를 바꿔준다.
chown root kairos
chmod 4755 kairos

여기까지 진행한뒤에 카이로스를 기동시키면 핀 메모리 설정이 잘 되었는지 메세지가 출력될것이다.

iPhone 에서 작성된 글입니다.
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


지난번에 Postgres-XC 1.0.0에 대해서 글을 올렸는데 아직 문제가 좀 있다고 했었죠 이번에 1.0.1 버전을 테스트한 결과를 정리해서 올립니다. 짧게 얘기하면 "좋아졌다"입니다. ^^/


• 1.0.1 버전 개요
Postgres-XC 1.0.1은 PostgreSQL 9.1.5를 기반으로 만들어졌습니다.


• 지난버전 테스트 결과와 다른 점
1. 관리 툴
pgAdmin III 1.16.0 버전을 사용하면 오류메시지없이 접속됩니다. 한가지 아쉬운점이라면 dbms 버전 정보에는 PostgreSQL 9.1.5로 표시된다는 점입니다.

2. 트랜잭션 문제 해결
함수 내부에서 "select for update"로 데이터를 가져와서 다이나믹쿼리로 update문을 실행하면 일부 세션에서 데이터를 잘못가져오는 문제가 해결되었습니다.
1번 세션에서 begin 명령으로 트랜잭션을 시작한 후, 해당 함수를 실행한 뒤에 2번 세션에서 함수를 실행했을때 1번 세션의 트랜잭션이 종료된 후 update된 값을 "select fir update"로 가져와서 update해줍니다. 정상적으로 작동한다는 얘기입니다.
제 설명이 좀 복잡한가요? 회사에서 아이폰으로 작성하는거라 좀 시간도 부족하고 글 쓰기도 좀 힘드네요. 다음에 코드와 함께 집에서 다듬어서 적성하겠습니다.



iPhone 에서 작성된 글입니다.
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


Open source RDBMS인 PostgreSQL은 현재 9.1.3버전까지 나온 잘 만들어진 DBMS이지만 아주 큰 약점들이 있다. 오늘은 그중 하나인 계층형 쿼리 기능에 대한 해법을 말해보고자한다.
계층형 쿼리, Hierachical Query는 보통 조직도나 다단계 분류표 등의 구조를 나타내는데 쓰는 구문으로 Oracle RDBMS에서 "start with ~ connect by~"의 형태로 쓰며, 보통 "connect by"로 불리운다. 그런데 PostgreSQL에서는 계층형 쿼리를 쓰려면 추가 모듈을 설치해야 하는데, 이 모듈을 설치하면 쓸 수 있는 connectby라는 함수는 속도가 아주 느리다. 그래서 "connect by"를 따로 구현해 보았다.

입력받은 테이블과 컬럼 이름으로 "with recursive" 구문을 문자열로 만들어서 PL/pgSQL의 dynamic query를 이용해서 실행하고, 결과를 result set 형식으로 반환하는 방식이다.


create or replace udf_connect_by (tab_name varchar, key_name varchar, parent_key_name varchar, start_with varchar)
return SETOF record
as $$
declare
v_rowcnt integer;
v_query varchar;
begin
select count(*) into v_rowcnt
from pg_tables
where tablename = tab_name;

if v_rowcnt = 0 then
raise exception 'Invalid table name';
end if;

v_query := 'with recursive T1(select *, 1 as r_level, array[' || key_name || '::varchar] as r_path, false r_flag
from ' || tab_name || '
where ' || start_with || '
union all
select B.*, T1.r_level + 1 as r_level, array_append(T1.r_path, ' || key_name || '::varchar) as r_path, B.' || key_name || '::varchar = any(T1.r_path) as r_flag
from ' || tab_name || ' B, T1
where not r_flag
and B.' || parent_key_name || ' = T1.' || key_name || ')
select * from T1 order by T1.r_path ';

return query execute v_query;



end;
$$
language pl/pgsql
;



iPhone 에서 작성된 글입니다.


신고
크리에이티브 커먼즈 라이선스
Creative Commons License
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST