PostgreSQL

PostgreSQL: postgres_fdw vs dblink

dewstream 2025. 5. 28. 08:00
728x90

※ PostgreSQL: postgres_fdw vs dblink.

 

안녕하세요. 듀스트림입니다.

 

오늘은 PostgreSQL 데이터베이스 간 연결 및 쿼리 실행을 위한 익스텐션인 postgresql_fdw와 dblink의 차이에 대해 알아보겠습니다.


postgres_fdw vs dblink

기능 비교

항목 postgres_fdw dblink
기본 개념 외부 PostgreSQL 서버의 테이블을 로컬 테이블처럼 조회 가능 외부 서버로 SQL을 전달하여 결과를 가져오는 함수
사용 방식 외부 테이블 정의 후 SELECT, INSERT, UPDATE, DELETE 가능 SQL을 문자열로 전달하여 SELECT, INSERT 등 직접 실행
쿼리 통합 로컬 쿼리와 통합된 실행 계획 사용 가능 (조인 최적화 등) 로컬 쿼리와 분리, 서버 간 조인 불가
보안 user mapping을 통한 연결 정보 저장, 비밀번호 암호화 가능 연결 정보(비밀번호 포함)를 함수 호출 시 문자열로 직접 기술해야 함
지원하는 기능 읽기/쓰기, 조인, 통계정보 기반 최적화 읽기/쓰기 가능하나 쿼리 문자열 기반, 통계 반영 없음
설치 방법 CREATE EXTENSION postgres_fdw; CREATE EXTENSION dblink;
권장 사용 시나리오 장기적인 연동, 통합 쿼리, 여러 쿼리 수행 간단한 데이터 조회, ad-hoc 접근, 관리 기능용 로직
보안 우수성 높음 (pg_user_mappings) 낮음 (비밀번호 노출 가능)
VIEW/Foreign Table 사용 가능 여부 예 (CREATE FOREIGN TABLE) 아니오 (테이블처럼 사용 불가)

 

요약

항목 설명
보안 dblink는 비밀번호가 평문 문자열로 노출되므로 postgres_fdw가 훨씬 안전함.
통합 쿼리 postgres_fdw는 서버 간 조인도 가능하며, planner가 통계 기반 최적화 수행.
DML 둘 다 INSERT, UPDATE, DELETE 가능하지만 postgres_fdw는 테이블 기반으로 좀 더 직관적.
성능 postgres_fdw는 데이터 푸시다운(pushdown)으로 더 효율적인 실행이 가능함.
  • 임시적이거나 관리용 유틸성 작업 등 간단한 조회 정도는 dblink를 사용하셔도 괜찮지만, 그 외는 postgres_fdw 사용을 권장 드립니다.

postgres_fdw 예시

-- 확장 모듈 설치
CREATE EXTENSION postgres_fdw;

-- 서버 객체 생성
CREATE SERVER foreign_server
  FOREIGN DATA WRAPPER postgres_fdw
  OPTIONS (host '192.168.1.10', port '5432', dbname 'remote_db');

-- 매핑 (유저와 비밀번호는 로컬에서 매핑)
CREATE USER MAPPING FOR CURRENT_USER
  SERVER foreign_server
  OPTIONS (user 'remote_user', password 'secret');

-- 외부 테이블 정의
CREATE FOREIGN TABLE remote_table (
  id int,
  name text
) SERVER foreign_server OPTIONS (schema_name 'public', table_name 'users');

-- 일반 쿼리처럼 사용 가능
SELECT * FROM remote_table WHERE id < 100;

 

 

 

F.36. postgres_fdw — access data stored in external PostgreSQL servers

F.36. postgres_fdw — access data stored in external PostgreSQL servers # F.36.1. FDW Options of postgres_fdw F.36.2. Functions F.36.3. Connection Management …

www.postgresql.org


dblink 예시

-- 확장 모듈 설치
CREATE EXTENSION dblink;

-- 연결 문자열을 사용한 쿼리: SELECT
SELECT * FROM dblink('dbname=remote_db host=192.168.1.10 user=remote_user password=secret',
                     'SELECT id, name FROM users WHERE id < 100')
AS t(id int, name text);

-- 연결 문자열을 사용한 쿼리: INSERT
SELECT * FROM dblink(
    'dbname=remote_db host=192.168.1.10 user=remote_user password=secret',
    'INSERT INTO users (id, name) VALUES (101, ''John Doe'') RETURNING id, name'
) AS t(id int, name text);
  • dblink로 INSERT를 실행할 때 반환값을 반드시 받아야 하며, 이를 위해 RETURNING 절을 추가하여 삽입된 데이터를 반환하도록 해야 합니다. (RETURNING 절을 추가 안해도 원 테이블에 인서트는 되지만, 오류 메시지가 출력됩니다.)

 

 

F.11. dblink — connect to other PostgreSQL databases

F.11. dblink — connect to other PostgreSQL databases # dblink_connect — opens a persistent connection to a remote database dblink_connect_u — …

www.postgresql.org


오늘은 여기까지~

 

728x90