Database

Windows 용 PostgresSQL 17 에 hypopg 확장 컴파일 및 설치 하기

달빛에취하다 2026. 6. 2. 16:48

작성일 - 2026-06-02 16:40

Windows 용 pgSQL 17 에 hypopg 확장을 컴파일 해서 설치하는 내용입니다.

 

공식지원이나 AI 쪽에서 레퍼런스가 없습니다. 그래서 아래 환경이나 프로그램은 되도록이면 맞춰서 진행해야 합니다.

능력자 분들께서는 각 개인 환경에 맞춰서 진행해 주시면 됩니다. 

좋은 내용이 있으면 댓글도 부탁드립니다.

 

1. Visual Studio Build Tool ( 2016 ) - 설치

1.1. 워크로드

  • C++를 사용한 데스크톱 개발
  • MSVC v143 - VS 2022 C++ x64/x86 빌드 도구 (v14.44) <← 14.44 가 꼭 필요함

1.2. 개별 구성 요소

  • Windows 유니버셜 C 런타임
  • Windows 유니버셜 CRT SDK
  • Windows 11 SDK (10.0.22621.0) → 되도록이면 preview 버전 말고 공식 버전

2. Developer Command Prompt for VS

2.1. 관리자 권한으로 실행

2.2. MSVC 14.44 환경 로드

call "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Auxiliary\Build\vcvars64.bat" -vcvars_ver=14.44

3. hypopg 확장

3.1. git clone 및 폴더 복제

  • git 이 미리 설치 되어 있어야 함
  •  
C:\Windows\System32>d:

D:\>git clone https://github.com/HypoPG/hypopg.git
Cloning into 'hypopg'...
remote: Enumerating objects: 2112, done.
remote: Counting objects: 100% (462/462), done.
remote: Compressing objects: 100% (127/127), done.
remote: Total 2112 (delta 375), reused 340 (delta 334), pack-reused 1650 (from 1)
Receiving objects: 100% (2112/2112), 733.26 KiB | 5.27 MiB/s, done.
Resolving deltas: 100% (1413/1413), done.

D:\>cd hypopg

D:\hypopg>xcopy .\include .\import\include /E /I /H /Y
.\include\hypopg.h
.\include\hypopg_import.h
.\include\hypopg_import_index.h
.\include\hypopg_index.h
4개 파일이 복사되었습니다.

D:\hypopg>

3.2. Makefile.win 파일 작성

  • 되도록이면 VS CODE 같은 것으로 작성
  • Windows SDK 버전이 다른 경우 경로를 찾아서 변경
  • MSVC의 14.44 의 세부 버전이 다른 경로 해당 경로로 변경 필요
  • Makefile.win 파일 내용
  •  

Makefile.win
0.00MB

PGROOT = C:/Program Files/PostgreSQL/17

CC = cl
LINK = link

INCLUDE = \
 /I"$(PGROOT)/include/server" \
 /I"$(PGROOT)/include/internal" \
 /I"$(PGROOT)/include" \
 /I"$(PGROOT)/include/server/port/win32_msvc" \
 /I"C:/Program Files (x86)/Microsoft Visual Studio/18/BuildTools/VC/Tools/MSVC/14.44.35207/include" \
 /I"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/ucrt" \
 /I"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/um" \
 /I"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/shared" \
 /I"C:/Program Files (x86)/Windows Kits/10/Include/10.0.22621.0/cppwinrt" \
 /I"$(PGROOT)/include/server/port/win32"

CFLAGS = /nologo /O2 /DWIN32 /D_WINDOWS $(INCLUDE)

OBJS = \
 hypopg.obj \
 hypopg_index.obj \
 import/hypopg_import.obj \
 import/hypopg_import_index.obj

all: hypopg.dll

hypopg.dll: $(OBJS)
	$(LINK) /DLL /OUT:hypopg.dll $(OBJS) \
	"$(PGROOT)/lib/postgres.lib" \
	/INCREMENTAL:NO

hypopg.obj: hypopg.c
	$(CC) $(CFLAGS) /c hypopg.c /Fo$@

hypopg_index.obj: hypopg_index.c
	$(CC) $(CFLAGS) /c hypopg_index.c /Fo$@

import/hypopg_import.obj: import/hypopg_import.c
	$(CC) $(CFLAGS) /c import/hypopg_import.c /Fo$@

import/hypopg_import_index.obj: import/hypopg_import_index.c
	$(CC) $(CFLAGS) /c import/hypopg_import_index.c /Fo$@

clean:
	cmd.exe /C "del /Q *.obj 2>NUL"
	cmd.exe /C "del /Q import\\*.obj 2>NUL"
	cmd.exe /C "del /Q hypopg.dll 2>NUL"

 

3.3. 컴파일

# 이건 생성된 파일 초기화 - 오류 등으로 중단 경우
nmake /F Makefile.win clean

# Makefile.win 으로 컴파일
nmake /F Makefile.win

3.4. 파일 복사

D:\hypopg>**copy hypopg.dll "C:\Program Files\PostgreSQL\17\lib\"**
        1개 파일이 복사되었습니다.

D:\hypopg>**copy hypopg.control "C:\Program Files\PostgreSQL\17\share\extension\"**
        1개 파일이 복사되었습니다.

D:\hypopg>**copy hypopg--*.sql "C:\Program Files\PostgreSQL\17\share\extension\"**
hypopg--1.3.1--1.4.0.sql
hypopg--1.3.1.sql
hypopg--1.4.0--1.4.1.sql
hypopg--1.4.0.sql
hypopg--1.4.1--1.4.2.sql
hypopg--1.4.1.sql
hypopg--1.4.2.sql
        7개 파일이 복사되었습니다.

D:\hypopg>

4. 가상 인덱스 테스트

4.1. 확장 프로그램 생성? 활성화?

CREATE EXTENSION IF NOT EXISTS hypopg;

4.2. 테스트 테이블 생성 및 데이터 생성

-- 1. 테스트 테이블 생성 및 데이터 생성
CREATE TABLE hypo_test (id serial PRIMARY KEY, val integer, name text);
INSERT INTO hypo_test (val, name)
SELECT (random()*100000)::int, 'name_' || g
FROM generate_series(1, 100000) g;
ANALYZE hypo_test;

4.3. 인덱스 없는 상태의 플랜 확인 (Seq Scan 확인)

-- 2. 인덱스 없는 상태의 플랜 (Seq Scan 나올 것)
EXPLAIN SELECT * FROM hypo_test WHERE val = 5000;

4.4. 가상 인덱스 생성 (실제 디스크에는 안 만들어짐)

-- 3. 가상 인덱스 생성 (실제 디스크에는 안 만들어짐)
SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo_test (val)');

4.5. 4.3. 와 같은 쿼리의 EXPLAIN 다시 확인 (Index Scan으로 바뀌면 성공)

-- 3. 가상 인덱스 생성 (실제 디스크에는 안 만들어짐)
SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo_test (val)');

4.6. 인덱스 예상 크기 확인 - (byte)

  • 4.4. 에서 확인되는 indexid 를 사용함
--예상 크기 확인  (4.3. 에서 확인되는 indexid 를 사용함 )
SELECT hypopg_relation_size(14942);

4.7. 인덱스 삭제

-- 전체 삭제
SELECT hypopg_reset();

-- 특정 인덱스 삭제
SELECT hypopg_drop_index(14942);

4.8. 전체 가상 인덱스 정보

-- 전체 가상 인덱스 목록
SELECT * FROM hypopg_list_indexes;

-- 좀더 세부 정보
SELECT * FROM hypopg();