1. 환경 구성


2. 테스트 구조


3. 테스트 준비 스크립트

(1) docker-compose.yml

version: '3.8'

services:
  pg17:
    image: postgres:17
    container_name: pg17
    environment:
      POSTGRES_DB: testdb
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: pass
    ports:
      - "5417:5432"
    volumes:
      - pg17data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
      - ./test_data:/test_data

  pg18:
    build:
      context: .
      dockerfile: Dockerfile.pg18
    container_name: pg18
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: pass
    ports:
      - "5434:5432"
    volumes:
      - pg18data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
      - ./test_data:/test_data
    stdin_open: true
    tty: true

volumes:
  pg17data:
  pg18data:

(2) Dockerfile.pg18

FROM debian:bullseye

# 필수 패키지 설치 (pkg-config 포함)
RUN apt-get update && apt-get install -y \\
  build-essential \\
  libreadline-dev zlib1g-dev flex bison libssl-dev \\
  libxml2-dev libxslt1-dev libcurl4-openssl-dev libicu-dev \\
  libperl-dev wget git ca-certificates sudo pkg-config \\
  libzstd-dev liblz4-dev libedit-dev libevent-dev \\
  locales

# 환경 변수
ENV PATH="/usr/local/pgsql/bin:$PATH"
ENV PGDATA="/var/lib/postgresql/data"

# 작업 디렉토리 생성
WORKDIR /usr/local/src

# 베타 소스 압축 파일 복사
COPY postgresql-18beta1.tar.gz .

# 압축 해제 및 디렉토리 이름 변수 설정
RUN tar -xzf postgresql-18beta1.tar.gz && \\
    mv postgresql-18beta1 postgresql && \\
    rm postgresql-18beta1.tar.gz

WORKDIR /usr/local/src/postgresql

# 빌드 및 설치
RUN ./configure --prefix=/usr/local/pgsql \\
  && make -j$(nproc) \\
  && make install

# postgres 유저 생성, 데이터 디렉토리 생성 및 권한 부여
RUN useradd -m postgres && mkdir -p $PGDATA && chown -R postgres $PGDATA

USER postgres

# 초기화
RUN /usr/local/pgsql/bin/initdb -D $PGDATA

EXPOSE 5432

# 컨테이너 시작 시 postgres 실행, 설정 파일 경로 지정
CMD ["postgres", "-c", "config_file=/var/lib/postgresql/data/postgresql.conf"]

4. 측정 Bash 스크립트

✅ PostgreSQL 17

# 캐시 클리어
sudo sh -c 'sync; echo 3 > /proc/sys/vm/drop_caches'

# 쿼리 실행 시간 측정 + 결과 저장
docker exec -i pg17 bash -c '
START=$(date +%s%3N)
RES=$(psql -U postgres -d testdb -c "SELECT COUNT(*) FROM test;" -tA)
END=$(date +%s%3N)
DURATION=$((END - START))

echo "{ \\"version\\": \\"17\\", \\"io_method\\": \\"sync\\", \\"count\\": \\"$RES\\", \\"duration_ms\\": $DURATION }" | tee /test_data/ver_17.json
'