PostgreSQL의 dblink extension을 이용한 autonomous 트랜잭션 구현 방법

PostgreSQL은 현재까지(버전 9.6) plpgsql내에서 autonomous 트랜잭션을 지원하지 않습니다. 하지만 dblink 익스텐션을 이용하면 autonomous 트랜잭션을 구현하는 것이 가능합니다. 제 경우에는 Vacuum 동작원리를 파악하기 위해 XID를 빠르게 증가시킬 필요가 있었습니다. 하지만 PostgreSQL은 LOOP 내에서의 COMMIT을 허용하지 않으므로 dblink 익스텐션을 이용해서 해당 기능을 구현했습니다. 사용 방법은 다음과 같습니다.

1. DBLINK 익스텐션 설치

test=# create extension dblink;

2. DBLINK를 이용해서 매건 커밋하는 프로시저 생성

-- 성능을 위해서 dblink_connect 및 dblink_disconnect는 프로시저 외부에서 수행하도록 변경 

CREATE OR REPLACE FUNCTION insert_t1(v1 integer) RETURNS VOID AS $$
BEGIN
           -- PERFORM dblink_connect('myconn','dbname=test port=5433 user=postgres password=oracle');
           PERFORM dblink('myconn','INSERT INTO t1 SELECT ' || '''' || v1 || '''');
           PERFORM dblink('myconn','COMMIT;');
           -- PERFORM dblink_disconnect('myconn');
END;
$$ LANGUAGE plpgsql;

3. 매건 커밋하는 프로시저를 호출하는 프로시저 생성

CREATE or replace FUNCTION loop_insert_t1(v_loop integer) RETURNS VOID AS $$
BEGIN

    FOR i in 1..v_loop LOOP
        PERFORM insert_t1(i);
    END LOOP;
END;
$$ LANGUAGE plpgsql;

4. DBLINK 연결 -> LOOP 수행 -> DBLINK 연결 해제

다음과 같은 방법을 이용하면 아주 빠르고 편리하게 XID를 증가시킬 수 있습니다. 테스트 시에 도움이 되길 바랍니다.

-- DBLINK 연결
test=# select dblink_connect('myconn','dbname=test port=5433 user=postgres password=oracle');

--프로시저 수행
test=# select loop_insert_t1(100000000);

--DBLINK 연결해제
test=# select dblink_disconnect('myconn');
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s