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
'PostgreSQL' 카테고리의 다른 글
| PostgreSQL: 병렬 INSERT가 되지 않는 이유 (1) | 2025.06.08 |
|---|---|
| PostgreSQL: EXPLAIN (0) | 2025.05.29 |
| PostgreSQL: work_mem (0) | 2025.05.27 |
| PostgreSQL: Disk Spill (0) | 2025.05.26 |
| PostgreSQL: ExprContext 기반 GeoJSON 조회 쿼리로 인한 OOM(Out of Memory) 발생 사례 분석 (0) | 2025.05.24 |