<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=PostgreSQL_%EC%9E%85%EB%AC%B8</id>
	<title>PostgreSQL 입문 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=PostgreSQL_%EC%9E%85%EB%AC%B8"/>
	<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=PostgreSQL_%EC%9E%85%EB%AC%B8&amp;action=history"/>
	<updated>2026-11-04T09:16:40Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=PostgreSQL_%EC%9E%85%EB%AC%B8&amp;diff=2043&amp;oldid=prev</id>
		<title>Dbstudy: PostgreSQL 초보 입문자용 문서 생성</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=PostgreSQL_%EC%9E%85%EB%AC%B8&amp;diff=2043&amp;oldid=prev"/>
		<updated>2026-11-04T06:43:53Z</updated>

		<summary type="html">&lt;p&gt;PostgreSQL 초보 입문자용 문서 생성&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{타이틀 주제&lt;br /&gt;
|부제 = POSTGRESQL · FOUNDATION COURSE&lt;br /&gt;
|제목 = PostgreSQL 입문&lt;br /&gt;
|설명 = 세계에서 가장 진보한 오픈소스 관계형 데이터베이스 — 설치와 psql부터 MVCC·VACUUM, 인덱스, 백업까지&amp;lt;br/&amp;gt;처음 시작하는 사람과 Oracle 사용자를 위한 단계별 가이드&lt;br /&gt;
|색상1 = #12324f&lt;br /&gt;
|색상2 = #1f5a8a&lt;br /&gt;
|색상3 = #336791&lt;br /&gt;
|배지1 = 난이도 · 입문&lt;br /&gt;
|배지2 = 학습기간 · 10주&lt;br /&gt;
|배지3 = 기준 · PostgreSQL 16 이상&lt;br /&gt;
|배지4 = 비교 · Oracle 19c&lt;br /&gt;
}}&lt;br /&gt;
{{단계양식&lt;br /&gt;
|제목1 = 개념 · 설치&lt;br /&gt;
|설명1 = PostgreSQL의 특징, 설치와 psql 접속&lt;br /&gt;
|제목2 = SQL · 데이터 타입&lt;br /&gt;
|설명2 = DDL·DML, IDENTITY, JSONB, 스키마&lt;br /&gt;
|제목3 = 내부 구조&lt;br /&gt;
|설명3 = 프로세스·메모리, MVCC와 VACUUM, WAL&lt;br /&gt;
|제목4 = 성능 · 운영&lt;br /&gt;
|설명4 = 인덱스, EXPLAIN, 권한, 백업·복구&lt;br /&gt;
}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== 1. PostgreSQL이란 ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;PostgreSQL&amp;#039;&amp;#039;&amp;#039;(포스트그레스큐엘, 줄여서 Postgres)은 1986년 UC 버클리의 POSTGRES 프로젝트에서 시작된 &amp;#039;&amp;#039;&amp;#039;오픈소스 객체-관계형 데이터베이스(ORDBMS)&amp;#039;&amp;#039;&amp;#039;이다. 표준 SQL 준수도가 높고, 확장성(Extension)과 안정성이 뛰어나 스타트업부터 대기업·공공기관까지 널리 쓰인다.&lt;br /&gt;
&lt;br /&gt;
{{요점|제목=한 줄 정의|내용=라이선스 비용 없이 쓸 수 있는, &amp;#039;&amp;#039;&amp;#039;표준 SQL&amp;#039;&amp;#039;&amp;#039;과 &amp;#039;&amp;#039;&amp;#039;확장성&amp;#039;&amp;#039;&amp;#039;에 강한 엔터프라이즈급 오픈소스 RDBMS}}&lt;br /&gt;
&lt;br /&gt;
=== 1.1 주요 특징 ===&lt;br /&gt;
{{카드묶음|최소너비=230px|&lt;br /&gt;
{{학습카드|번호=OPEN SOURCE|제목=자유로운 라이선스|설명=PostgreSQL License(BSD 계열). 상용 제품에 포함·수정·배포가 자유롭다.}}&lt;br /&gt;
{{학습카드|번호=STANDARD|제목=높은 SQL 표준 준수|설명=CTE, 윈도우 함수, MERGE, 트랜잭션 DDL 등 표준 기능을 폭넓게 지원한다.}}&lt;br /&gt;
{{학습카드|번호=EXTENSIBLE|제목=확장 기능|설명=PostGIS(공간), pg_stat_statements(SQL 통계), pgvector(벡터) 등 Extension으로 기능을 추가한다.}}&lt;br /&gt;
{{학습카드|번호=MVCC|제목=다중 버전 동시성 제어|설명=읽기와 쓰기가 서로를 막지 않는다. 대신 VACUUM으로 오래된 버전을 정리해야 한다.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 1.2 Oracle과 한눈에 비교 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 구분 !! Oracle !! PostgreSQL&lt;br /&gt;
|-&lt;br /&gt;
| 라이선스 || 상용 (Edition·옵션별 비용) || 오픈소스 (무료)&lt;br /&gt;
|-&lt;br /&gt;
| 프로세스 구조 || 백그라운드 프로세스 + 서버 프로세스 (전용/공유 서버) || &amp;#039;&amp;#039;&amp;#039;접속 1개 = 백엔드 프로세스 1개&amp;#039;&amp;#039;&amp;#039; (커넥션 풀 권장)&lt;br /&gt;
|-&lt;br /&gt;
| 언두(Undo) 관리 || Undo 테이블스페이스에 이전 이미지 저장 || &amp;#039;&amp;#039;&amp;#039;테이블 안에 이전 버전 행(튜플)을 함께 저장&amp;#039;&amp;#039;&amp;#039; → VACUUM 필요&lt;br /&gt;
|-&lt;br /&gt;
| 리두 로그 || Redo Log / Archive Log || &amp;#039;&amp;#039;&amp;#039;WAL&amp;#039;&amp;#039;&amp;#039;(Write-Ahead Log) / WAL 아카이브&lt;br /&gt;
|-&lt;br /&gt;
| 논리 구조 || DB 1개(CDB/PDB) 안에 스키마 = 사용자 || 클러스터 → &amp;#039;&amp;#039;&amp;#039;여러 데이터베이스&amp;#039;&amp;#039;&amp;#039; → 스키마 (사용자와 스키마는 별개)&lt;br /&gt;
|-&lt;br /&gt;
| 트랜잭션 DDL || DDL 실행 시 자동 커밋 || &amp;#039;&amp;#039;&amp;#039;DDL도 롤백 가능&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 빈 문자열 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; = NULL || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; ≠ NULL (서로 다른 값)&lt;br /&gt;
|-&lt;br /&gt;
| 절차형 언어 || PL/SQL || PL/pgSQL (+ PL/Python 등)&lt;br /&gt;
|-&lt;br /&gt;
| 실행계획 확인 || DBMS_XPLAN, AUTOTRACE || &amp;#039;&amp;#039;&amp;#039;EXPLAIN (ANALYZE, BUFFERS)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 고가용성 || RAC, Data Guard || 스트리밍 복제(Streaming Replication), 논리 복제, Patroni 등 외부 도구&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2. 설치와 접속 ==&lt;br /&gt;
=== 2.1 가장 빠른 방법 — Docker ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d --name pg-lab \&lt;br /&gt;
  -e POSTGRES_PASSWORD=lab1234 \&lt;br /&gt;
  -p 5432:5432 \&lt;br /&gt;
  -v pgdata:/var/lib/postgresql/data \&lt;br /&gt;
  postgres:17&lt;br /&gt;
&lt;br /&gt;
docker exec -it pg-lab psql -U postgres&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Linux 패키지 설치 (Rocky/RHEL 계열 예) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# PostgreSQL 공식 저장소(PGDG) 등록 후&lt;br /&gt;
sudo dnf install -y postgresql17-server&lt;br /&gt;
sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
sudo systemctl enable --now postgresql-17&lt;br /&gt;
sudo -iu postgres psql&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{설명|제목=Windows / macOS|내용=EDB 설치 프로그램(Windows), Postgres.app 또는 Homebrew(macOS)를 사용하면 GUI로 간단히 설치할 수 있다. GUI 관리 도구로는 pgAdmin, DBeaver가 많이 쓰인다.}}&lt;br /&gt;
&lt;br /&gt;
=== 2.3 psql 필수 메타 명령 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 명령 !! 의미 !! Oracle에서 비슷한 것&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\l&amp;lt;/code&amp;gt; || 데이터베이스 목록 || &amp;lt;code&amp;gt;V$PDBS&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;show pdbs&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\c dbname&amp;lt;/code&amp;gt; || 다른 데이터베이스로 접속 전환 || &amp;lt;code&amp;gt;ALTER SESSION SET CONTAINER&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\dn&amp;lt;/code&amp;gt; || 스키마 목록 || &amp;lt;code&amp;gt;DBA_USERS&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\dt&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;\dt+&amp;lt;/code&amp;gt; || 테이블 목록 (+크기) || &amp;lt;code&amp;gt;USER_TABLES&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\d 테이블명&amp;lt;/code&amp;gt; || 테이블 구조 (컬럼·인덱스·제약) || &amp;lt;code&amp;gt;DESC&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\di&amp;lt;/code&amp;gt; || 인덱스 목록 || &amp;lt;code&amp;gt;USER_INDEXES&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\du&amp;lt;/code&amp;gt; || 롤(사용자) 목록 || &amp;lt;code&amp;gt;DBA_USERS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DBA_ROLES&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; || 세로 출력 전환 || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\timing&amp;lt;/code&amp;gt; || 실행 시간 표시 || &amp;lt;code&amp;gt;SET TIMING ON&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\i file.sql&amp;lt;/code&amp;gt; || 스크립트 실행 || &amp;lt;code&amp;gt;@file.sql&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\q&amp;lt;/code&amp;gt; || 종료 || &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3. 논리 구조 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 클러스터 (하나의 인스턴스, 하나의 데이터 디렉터리 PGDATA)&lt;br /&gt;
  ├─ 데이터베이스 postgres     ← 기본 접속용&lt;br /&gt;
  ├─ 데이터베이스 template1    ← CREATE DATABASE 시 복제 원본&lt;br /&gt;
  └─ 데이터베이스 appdb&lt;br /&gt;
       ├─ 스키마 public&lt;br /&gt;
       │    ├─ 테이블, 인덱스, 뷰, 시퀀스, 함수 …&lt;br /&gt;
       └─ 스키마 sales&lt;br /&gt;
  (공통) 롤(사용자) · 테이블스페이스 ← 클러스터 전체에서 공유&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{중요|내용=PostgreSQL에서 &amp;#039;&amp;#039;&amp;#039;데이터베이스 간 직접 조인은 불가능&amp;#039;&amp;#039;&amp;#039;하다 (dblink/postgres_fdw 확장 필요). 업무를 나눌 때는 보통 &amp;#039;&amp;#039;&amp;#039;하나의 데이터베이스 안에 여러 스키마&amp;#039;&amp;#039;&amp;#039;를 쓴다.}}&lt;br /&gt;
&lt;br /&gt;
=== 3.1 search_path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SHOW search_path;                 -- 기본: &amp;quot;$user&amp;quot;, public&lt;br /&gt;
SET search_path TO sales, public; -- 스키마 이름 없이 조회할 때 찾는 순서&lt;br /&gt;
ALTER ROLE app_user SET search_path TO sales, public;  -- 사용자 기본값 지정&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. 기본 SQL과 데이터 타입 ==&lt;br /&gt;
=== 4.1 주요 데이터 타입 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 용도 !! PostgreSQL !! Oracle 대응 !! 메모&lt;br /&gt;
|-&lt;br /&gt;
| 정수 || &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bigint&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;smallint&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NUMBER(10)&amp;lt;/code&amp;gt; || 정수는 정수형을 쓰면 더 빠르고 작다&lt;br /&gt;
|-&lt;br /&gt;
| 정밀 숫자 || &amp;lt;code&amp;gt;numeric(p,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NUMBER(p,s)&amp;lt;/code&amp;gt; || 금액&lt;br /&gt;
|-&lt;br /&gt;
| 문자 || &amp;lt;code&amp;gt;varchar(n)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;VARCHAR2(n)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CLOB&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;도 성능 차이 없음&lt;br /&gt;
|-&lt;br /&gt;
| 날짜 || &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DATE&amp;lt;/code&amp;gt; || &amp;#039;&amp;#039;&amp;#039;PostgreSQL date는 시간 없음&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 일시 || &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;timestamptz&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DATE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TIMESTAMP&amp;lt;/code&amp;gt; || 시간대가 있으면 &amp;lt;code&amp;gt;timestamptz&amp;lt;/code&amp;gt; 권장&lt;br /&gt;
|-&lt;br /&gt;
| 참/거짓 || &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; || (없음, CHAR(1) 등) ||&lt;br /&gt;
|-&lt;br /&gt;
| 반정형 || &amp;lt;code&amp;gt;jsonb&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;JSON&amp;lt;/code&amp;gt; || 인덱스(GIN) 가능&lt;br /&gt;
|-&lt;br /&gt;
| 배열 || &amp;lt;code&amp;gt;integer[]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text[]&amp;lt;/code&amp;gt; || (VARRAY) ||&lt;br /&gt;
|-&lt;br /&gt;
| 고유 ID || &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;RAW(16)&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 테이블 만들기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE customer (&lt;br /&gt;
    cust_id     bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,&lt;br /&gt;
    cust_nm     varchar(100) NOT NULL,&lt;br /&gt;
    email       varchar(200) UNIQUE,&lt;br /&gt;
    grade_cd    varchar(10)  NOT NULL DEFAULT &amp;#039;NORMAL&amp;#039;,&lt;br /&gt;
    attrs       jsonb,&lt;br /&gt;
    created_at  timestamptz  NOT NULL DEFAULT now()&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE orders (&lt;br /&gt;
    order_id    bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,&lt;br /&gt;
    cust_id     bigint NOT NULL REFERENCES customer (cust_id),&lt;br /&gt;
    order_dt    date   NOT NULL DEFAULT current_date,&lt;br /&gt;
    amount      numeric(12,2) NOT NULL CHECK (amount &amp;gt;= 0)&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_orders_cust ON orders (cust_id, order_dt);   -- FK 컬럼 인덱스는 자동 생성되지 않는다&lt;br /&gt;
&lt;br /&gt;
COMMENT ON TABLE customer IS &amp;#039;고객&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4.3 자주 쓰는 SQL ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- INSERT ... RETURNING : 생성된 키를 바로 받기&lt;br /&gt;
INSERT INTO customer (cust_nm, email) VALUES (&amp;#039;홍길동&amp;#039;, &amp;#039;hong@example.com&amp;#039;)&lt;br /&gt;
RETURNING cust_id;&lt;br /&gt;
&lt;br /&gt;
-- UPSERT&lt;br /&gt;
INSERT INTO customer (cust_nm, email) VALUES (&amp;#039;홍길동&amp;#039;, &amp;#039;hong@example.com&amp;#039;)&lt;br /&gt;
ON CONFLICT (email) DO UPDATE SET cust_nm = EXCLUDED.cust_nm;&lt;br /&gt;
&lt;br /&gt;
-- 페이징&lt;br /&gt;
SELECT * FROM orders ORDER BY order_dt DESC LIMIT 20 OFFSET 40;&lt;br /&gt;
&lt;br /&gt;
-- JSONB 조회&lt;br /&gt;
SELECT cust_nm FROM customer WHERE attrs -&amp;gt;&amp;gt; &amp;#039;channel&amp;#039; = &amp;#039;mobile&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
-- 트랜잭션 DDL: 롤백하면 테이블 생성도 취소된다&lt;br /&gt;
BEGIN;&lt;br /&gt;
CREATE TABLE tmp_test (id int);&lt;br /&gt;
ROLLBACK;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4.4 Oracle 사용자를 위한 문법 대응표 ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! Oracle !! PostgreSQL !! 비고&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SELECT 1 FROM DUAL&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;SELECT 1&amp;lt;/code&amp;gt; || DUAL 불필요&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NVL(a, b)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;COALESCE(a, b)&amp;lt;/code&amp;gt; || 표준 함수&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYSDATE&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;current_date&amp;lt;/code&amp;gt; || now()는 트랜잭션 시작 시각&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ROWNUM &amp;lt;= 10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;LIMIT 10&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;FETCH FIRST 10 ROWS ONLY&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;seq.NEXTVAL&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;nextval(&amp;#039;seq&amp;#039;)&amp;lt;/code&amp;gt; || 또는 IDENTITY 컬럼&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DECODE(a, 1, &amp;#039;x&amp;#039;, &amp;#039;y&amp;#039;)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;CASE a WHEN 1 THEN &amp;#039;x&amp;#039; ELSE &amp;#039;y&amp;#039; END&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TO_DATE(&amp;#039;20261104&amp;#039;,&amp;#039;YYYYMMDD&amp;#039;)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;to_date(&amp;#039;20261104&amp;#039;,&amp;#039;YYYYMMDD&amp;#039;)&amp;lt;/code&amp;gt; || 결과는 date (시간 없음)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;a &amp;amp;#124;&amp;amp;#124; b&amp;lt;/code&amp;gt; (NULL 무시) || &amp;lt;code&amp;gt;a &amp;amp;#124;&amp;amp;#124; b&amp;lt;/code&amp;gt; (NULL이면 결과 NULL) || &amp;lt;code&amp;gt;concat(a, b)&amp;lt;/code&amp;gt;는 NULL 무시&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MERGE INTO&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;MERGE INTO&amp;lt;/code&amp;gt; (15+) / &amp;lt;code&amp;gt;ON CONFLICT&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CONNECT BY&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;WITH RECURSIVE&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MINUS&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;EXCEPT&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| 동의어(SYNONYM) || 없음 (search_path, 뷰로 대체) ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 5. 내부 구조 ==&lt;br /&gt;
=== 5.1 프로세스와 메모리 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 클라이언트 ──접속──▶ postmaster(주 프로세스) ──fork──▶ backend 프로세스 (접속마다 1개)&lt;br /&gt;
                                                         │ work_mem (정렬·해시)&lt;br /&gt;
 ┌──────────────── 공유 메모리 ────────────────┐         ▼&lt;br /&gt;
 │ shared_buffers (데이터 페이지 캐시, 8KB)    │◀──── 읽기/쓰기&lt;br /&gt;
 │ WAL buffers                                  │&lt;br /&gt;
 └──────────────────────────────────────────────┘&lt;br /&gt;
 백그라운드: checkpointer · background writer · WAL writer · autovacuum launcher/worker&lt;br /&gt;
             · stats · archiver(아카이브 사용 시) · walsender(복제 시)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 파라미터 !! 역할 !! 출발점 (전용 서버 기준)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;shared_buffers&amp;lt;/code&amp;gt; || 공유 버퍼 캐시 || 메모리의 약 25%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;effective_cache_size&amp;lt;/code&amp;gt; || OS 캐시 포함 가용 캐시 추정치 (옵티마이저 참고값) || 메모리의 50~75%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;work_mem&amp;lt;/code&amp;gt; || 정렬·해시 작업당 메모리 (세션·노드별로 여러 개 사용 가능) || 4MB~64MB에서 시작해 조정&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;maintenance_work_mem&amp;lt;/code&amp;gt; || VACUUM, CREATE INDEX용 || 256MB~1GB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;max_connections&amp;lt;/code&amp;gt; || 최대 접속 수 || 너무 크게 잡지 말고 &amp;#039;&amp;#039;&amp;#039;PgBouncer&amp;#039;&amp;#039;&amp;#039; 같은 커넥션 풀 사용&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 5.2 MVCC와 VACUUM — 가장 중요한 개념 ===&lt;br /&gt;
{{핵심|제목=PostgreSQL MVCC의 핵심|내용=UPDATE는 기존 행을 고치지 않고 &amp;#039;&amp;#039;&amp;#039;새 버전 행을 추가&amp;#039;&amp;#039;&amp;#039;하고, 이전 행은 &amp;quot;죽은 튜플(dead tuple)&amp;quot;로 남긴다. DELETE도 표시만 한다. 이 죽은 튜플을 치우는 작업이 &amp;#039;&amp;#039;&amp;#039;VACUUM&amp;#039;&amp;#039;&amp;#039;이다.}}&lt;br /&gt;
&lt;br /&gt;
{{단계별양식2&lt;br /&gt;
|제목1 = INSERT |설명1 = 새 튜플 생성&lt;br /&gt;
|제목2 = UPDATE |설명2 = 새 버전 추가 + 옛 버전 dead&lt;br /&gt;
|제목3 = DELETE |설명3 = dead 표시&lt;br /&gt;
|제목4 = VACUUM |설명4 = dead 공간 재사용 가능 처리&lt;br /&gt;
|제목5 = FREEZE |설명5 = 트랜잭션 ID 순환 방지&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 작업 !! 하는 일 !! 잠금&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VACUUM&amp;lt;/code&amp;gt; || 죽은 튜플 공간을 재사용 가능하게 표시, 가시성 맵 갱신 || 일반 DML과 동시 수행 가능&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VACUUM (ANALYZE)&amp;lt;/code&amp;gt; || + 옵티마이저 통계 갱신 || 동시 수행 가능&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; || 테이블을 새로 써서 &amp;#039;&amp;#039;&amp;#039;OS에 공간 반환&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;배타 잠금&amp;#039;&amp;#039;&amp;#039; — 운영 중 사용 주의&lt;br /&gt;
|-&lt;br /&gt;
| autovacuum || 변경량 기준으로 자동 실행 || &amp;#039;&amp;#039;&amp;#039;끄지 말 것&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- 죽은 튜플이 많은 테이블 확인&lt;br /&gt;
SELECT relname, n_live_tup, n_dead_tup, last_autovacuum, last_autoanalyze&lt;br /&gt;
  FROM pg_stat_user_tables&lt;br /&gt;
 ORDER BY n_dead_tup DESC&lt;br /&gt;
 LIMIT 10;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{중요|내용=오래 열려 있는 트랜잭션(예: 커밋하지 않은 세션, idle in transaction)이 있으면 VACUUM이 죽은 튜플을 치우지 못해 &amp;#039;&amp;#039;&amp;#039;테이블이 계속 커진다(bloat)&amp;#039;&amp;#039;&amp;#039;. 애플리케이션에서 트랜잭션을 짧게 유지하는 것이 중요하다.}}&lt;br /&gt;
&lt;br /&gt;
=== 5.3 WAL과 체크포인트 ===&lt;br /&gt;
* 모든 변경은 데이터 파일보다 먼저 &amp;#039;&amp;#039;&amp;#039;WAL&amp;#039;&amp;#039;&amp;#039;에 기록된다 (Oracle의 Redo와 같은 역할).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;체크포인트&amp;#039;&amp;#039;&amp;#039;가 공유 버퍼의 변경 페이지를 디스크에 반영한다 (&amp;lt;code&amp;gt;checkpoint_timeout&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;max_wal_size&amp;lt;/code&amp;gt;).&lt;br /&gt;
* WAL을 보관(&amp;lt;code&amp;gt;archive_mode&amp;lt;/code&amp;gt;)하면 &amp;#039;&amp;#039;&amp;#039;시점 복구(PITR)&amp;#039;&amp;#039;&amp;#039;와 복제의 기반이 된다.&lt;br /&gt;
&lt;br /&gt;
== 6. 인덱스와 실행계획 ==&lt;br /&gt;
=== 6.1 인덱스 종류 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 종류 !! 적합한 경우 !! 예&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;B-tree&amp;#039;&amp;#039;&amp;#039; (기본) || =, 범위, 정렬 || &amp;lt;code&amp;gt;CREATE INDEX ix ON orders (order_dt);&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;GIN&amp;#039;&amp;#039;&amp;#039; || JSONB, 배열, 전문 검색 || &amp;lt;code&amp;gt;CREATE INDEX ix ON customer USING gin (attrs);&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;GiST&amp;#039;&amp;#039;&amp;#039; || 공간(PostGIS), 범위 타입, 근접 검색 || &amp;lt;code&amp;gt;USING gist (geom)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;BRIN&amp;#039;&amp;#039;&amp;#039; || 물리적 순서와 값이 비례하는 초대용량 로그·시계열 || &amp;lt;code&amp;gt;USING brin (created_at)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Hash || = 조건만 || 드물게 사용&lt;br /&gt;
|-&lt;br /&gt;
| 부분 인덱스 || 일부 행만 인덱싱 || &amp;lt;code&amp;gt;... WHERE status = &amp;#039;ERROR&amp;#039;;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 표현식 인덱스 || 함수 결과 || &amp;lt;code&amp;gt;... (lower(email));&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 커버링 || 테이블 방문 없이 결과 || &amp;lt;code&amp;gt;... (cust_id) INCLUDE (amount);&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{{설명|제목=운영 중 인덱스 생성|내용=&amp;lt;code&amp;gt;CREATE INDEX CONCURRENTLY&amp;lt;/code&amp;gt;를 쓰면 테이블 쓰기를 막지 않고 인덱스를 만든다 (트랜잭션 블록 안에서는 사용 불가).}}&lt;br /&gt;
&lt;br /&gt;
=== 6.2 EXPLAIN 읽기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
EXPLAIN (ANALYZE, BUFFERS)&lt;br /&gt;
SELECT c.cust_nm, sum(o.amount)&lt;br /&gt;
  FROM customer c JOIN orders o ON o.cust_id = c.cust_id&lt;br /&gt;
 WHERE o.order_dt &amp;gt;= current_date - 30&lt;br /&gt;
 GROUP BY c.cust_nm;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
HashAggregate  (cost=1250.3..1262.8 rows=1000 width=40) (actual time=12.4..12.9 rows=980 loops=1)&lt;br /&gt;
  Buffers: shared hit=845&lt;br /&gt;
  -&amp;gt;  Hash Join  (cost=32.5..1200.1 rows=10040 width=18) (actual time=0.6..9.8 rows=9876 loops=1)&lt;br /&gt;
        Hash Cond: (o.cust_id = c.cust_id)&lt;br /&gt;
        -&amp;gt;  Index Scan using ix_orders_dt on orders o  (... rows=10040) (actual ... rows=9876 loops=1)&lt;br /&gt;
              Index Cond: (order_dt &amp;gt;= (CURRENT_DATE - 30))&lt;br /&gt;
        -&amp;gt;  Hash  (... rows=1000) (actual ... rows=1000 loops=1)&lt;br /&gt;
              -&amp;gt;  Seq Scan on customer c  (... rows=1000) (actual ... rows=1000 loops=1)&lt;br /&gt;
Planning Time: 0.3 ms&lt;br /&gt;
Execution Time: 13.2 ms&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 항목 !! 의미 !! Oracle 대응&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cost=시작..전체&amp;lt;/code&amp;gt; || 옵티마이저 예상 비용 || Cost&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rows&amp;lt;/code&amp;gt; (앞) / &amp;lt;code&amp;gt;actual rows&amp;lt;/code&amp;gt; || 예상 행 수 / 실제 행 수 || E-Rows / A-Rows&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;loops&amp;lt;/code&amp;gt; || 해당 노드 반복 횟수 (actual rows는 1회 평균) || Starts&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Buffers: shared hit / read&amp;lt;/code&amp;gt; || 캐시 적중 / 디스크 읽기 블록 수 || Buffers / Reads&lt;br /&gt;
|-&lt;br /&gt;
| Seq Scan / Index Scan / Index Only Scan / Bitmap Heap Scan || 테이블 접근 방식 || Full Scan / Index Range Scan 등&lt;br /&gt;
|-&lt;br /&gt;
| Nested Loop / Hash Join / Merge Join || 조인 방식 || NL / Hash / Sort Merge&lt;br /&gt;
|}&lt;br /&gt;
{{요점|내용=읽는 법은 Oracle과 같다. &amp;#039;&amp;#039;&amp;#039;안쪽(들여쓰기 깊은 곳)부터&amp;#039;&amp;#039;&amp;#039; 읽고, &amp;#039;&amp;#039;&amp;#039;예상 rows와 actual rows가 크게 다른 노드&amp;#039;&amp;#039;&amp;#039;를 찾는다. 통계가 오래됐다면 &amp;lt;code&amp;gt;ANALYZE 테이블명;&amp;lt;/code&amp;gt;으로 갱신한다. → [[실행계획 읽기 실습]]}}&lt;br /&gt;
&lt;br /&gt;
== 7. 사용자·권한·접속 제어 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- 롤 = 사용자 + 그룹 (LOGIN 속성이 있으면 사용자)&lt;br /&gt;
CREATE ROLE app_user LOGIN PASSWORD &amp;#039;change_me&amp;#039;;&lt;br /&gt;
CREATE ROLE app_read;                       -- 권한 묶음용 그룹 롤&lt;br /&gt;
&lt;br /&gt;
CREATE SCHEMA sales AUTHORIZATION app_user;&lt;br /&gt;
GRANT USAGE  ON SCHEMA sales TO app_read;&lt;br /&gt;
GRANT SELECT ON ALL TABLES IN SCHEMA sales TO app_read;&lt;br /&gt;
ALTER DEFAULT PRIVILEGES IN SCHEMA sales GRANT SELECT ON TABLES TO app_read;  -- 앞으로 만들 테이블까지&lt;br /&gt;
GRANT app_read TO report_user;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;pg_hba.conf&amp;#039;&amp;#039;&amp;#039; — 어떤 호스트·사용자·DB에 어떤 인증 방식을 허용할지 정하는 파일 (Oracle의 sqlnet.ora 접속 제어와 비슷)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# TYPE  DATABASE  USER      ADDRESS          METHOD&lt;br /&gt;
local   all       postgres                   peer&lt;br /&gt;
host    appdb     app_user  10.0.0.0/24      scram-sha-256&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{설명|제목=설정 반영|내용=pg_hba.conf, 대부분의 postgresql.conf 변경은 &amp;lt;code&amp;gt;SELECT pg_reload_conf();&amp;lt;/code&amp;gt;로 반영된다. &amp;lt;code&amp;gt;shared_buffers&amp;lt;/code&amp;gt;처럼 재시작이 필요한 파라미터는 &amp;lt;code&amp;gt;pg_settings.context = &amp;#039;postmaster&amp;#039;&amp;lt;/code&amp;gt;로 확인한다.}}&lt;br /&gt;
&lt;br /&gt;
== 8. 백업과 복구 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 방식 !! 도구 !! 특징 !! Oracle 대응&lt;br /&gt;
|-&lt;br /&gt;
| 논리 백업 || &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; || DB·스키마·테이블 단위, 버전 간 이관 가능 || Data Pump (expdp/impdp)&lt;br /&gt;
|-&lt;br /&gt;
| 논리 복원 || &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;psql&amp;lt;/code&amp;gt; || 병렬 복원(&amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt;) 가능 ||&lt;br /&gt;
|-&lt;br /&gt;
| 물리 백업 || &amp;lt;code&amp;gt;pg_basebackup&amp;lt;/code&amp;gt; || 클러스터 전체 온라인 복사 || RMAN 백업&lt;br /&gt;
|-&lt;br /&gt;
| 시점 복구 || 베이스 백업 + WAL 아카이브 || 원하는 시각으로 복구 (PITR) || RMAN + Archive Log&lt;br /&gt;
|-&lt;br /&gt;
| 운영 도구 || pgBackRest, Barman || 증분·압축·보관 정책 관리 || RMAN Catalog&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pg_dump -U postgres -d appdb -Fc -f appdb.dump        # 사용자 정의 형식(압축)&lt;br /&gt;
pg_restore -U postgres -d appdb_new -j 4 appdb.dump   # 4개 병렬 복원&lt;br /&gt;
pg_basebackup -U replicator -D /backup/base -Ft -z -P # 물리 베이스 백업&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. 모니터링 기본 쿼리 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- 현재 세션과 대기 상태 (Oracle V$SESSION)&lt;br /&gt;
SELECT pid, usename, state, wait_event_type, wait_event,&lt;br /&gt;
       now() - xact_start AS xact_age, left(query, 60) AS query&lt;br /&gt;
  FROM pg_stat_activity&lt;br /&gt;
 WHERE state &amp;lt;&amp;gt; &amp;#039;idle&amp;#039;&lt;br /&gt;
 ORDER BY xact_age DESC NULLS LAST;&lt;br /&gt;
&lt;br /&gt;
-- 락 대기 원인 세션 찾기&lt;br /&gt;
SELECT pid, pg_blocking_pids(pid) AS blocked_by, left(query, 60)&lt;br /&gt;
  FROM pg_stat_activity&lt;br /&gt;
 WHERE cardinality(pg_blocking_pids(pid)) &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
-- 부하 상위 SQL (pg_stat_statements 확장 필요, Oracle V$SQL)&lt;br /&gt;
SELECT calls, round(total_exec_time) AS total_ms, round(mean_exec_time, 2) AS mean_ms,&lt;br /&gt;
       shared_blks_hit + shared_blks_read AS blks, left(query, 60)&lt;br /&gt;
  FROM pg_stat_statements&lt;br /&gt;
 ORDER BY total_exec_time DESC&lt;br /&gt;
 LIMIT 10;&lt;br /&gt;
&lt;br /&gt;
-- 테이블·인덱스 크기&lt;br /&gt;
SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) AS total&lt;br /&gt;
  FROM pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC LIMIT 10;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. 학습 커리큘럼 (10주) ==&lt;br /&gt;
{{안내바|강조=설치 → SQL → 내부 구조 → 성능 → 운영|내용=한 주에 이론 3시간 + 실습 3시간|우측=Oracle 경험자는 1~2주차를 빠르게 넘어가도 좋습니다.}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:8%;&amp;quot; | 주차 !! style=&amp;quot;width:12%;&amp;quot; | 단계 !! style=&amp;quot;width:22%;&amp;quot; | 주제 !! 세부 내용 !! style=&amp;quot;width:22%;&amp;quot; | 실습&lt;br /&gt;
|-&lt;br /&gt;
| 1 || rowspan=&amp;quot;2&amp;quot; | 기초 || PostgreSQL 소개와 설치 || 역사·특징·라이선스, Docker/패키지 설치, psql, pgAdmin/DBeaver || 실습 서버 구축, psql 메타 명령&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 논리 구조와 기본 SQL || 클러스터·DB·스키마, search_path, DDL/DML, 트랜잭션 DDL || 샘플 스키마 생성&lt;br /&gt;
|-&lt;br /&gt;
| 3 || rowspan=&amp;quot;2&amp;quot; | SQL || 데이터 타입과 제약조건 || 숫자·문자·날짜, IDENTITY·시퀀스, JSONB, 배열, 제약조건 || 쇼핑몰 테이블 설계&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 고급 SQL || CTE·WITH RECURSIVE, 윈도우 함수, UPSERT, RETURNING, Oracle 문법 차이 || Oracle SQL 10개 변환&lt;br /&gt;
|-&lt;br /&gt;
| 5 || rowspan=&amp;quot;2&amp;quot; | 내부 구조 || 아키텍처 || 프로세스·공유 메모리, WAL, 체크포인트, 주요 파라미터 || postgresql.conf 분석&lt;br /&gt;
|-&lt;br /&gt;
| 6 || MVCC와 VACUUM || 튜플 버전, dead tuple, autovacuum, bloat, 트랜잭션 ID 순환 || UPDATE 반복 후 bloat 관찰&lt;br /&gt;
|-&lt;br /&gt;
| 7 || rowspan=&amp;quot;2&amp;quot; | 성능 || 인덱스 || B-tree·GIN·BRIN·부분·표현식·커버링, CONCURRENTLY || JSONB GIN 인덱스 효과 비교&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 실행계획과 통계 || EXPLAIN (ANALYZE, BUFFERS), 조인 방식, ANALYZE, pg_stat_statements || 느린 SQL 3개 튜닝&lt;br /&gt;
|-&lt;br /&gt;
| 9 || rowspan=&amp;quot;2&amp;quot; | 운영 || 보안과 모니터링 || 롤·권한, pg_hba.conf, pg_stat_activity, 락 분석 || 읽기 전용 계정 설계&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 백업·복구·복제 || pg_dump/pg_restore, pg_basebackup, PITR, 스트리밍 복제 개요 || 특정 시점 복구 실습&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 11. 입문자 체크리스트 ==&lt;br /&gt;
{{노트박스&lt;br /&gt;
|라벨 = SELF CHECK&lt;br /&gt;
|제목 = 이 정도면 입문 완료&lt;br /&gt;
|내용 = □ psql로 접속해 DB·스키마·테이블 구조를 확인할 수 있다&amp;lt;br/&amp;gt;□ 클러스터 · 데이터베이스 · 스키마 · 롤의 관계를 설명할 수 있다&amp;lt;br/&amp;gt;□ IDENTITY, JSONB, timestamptz를 사용한 테이블을 만들 수 있다&amp;lt;br/&amp;gt;□ MVCC에서 UPDATE가 dead tuple을 남기는 이유와 VACUUM의 역할을 설명할 수 있다&amp;lt;br/&amp;gt;□ EXPLAIN (ANALYZE, BUFFERS)로 예상 행 수와 실제 행 수를 비교할 수 있다&amp;lt;br/&amp;gt;□ pg_dump로 백업하고 pg_restore로 복원할 수 있다&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 12. 용어집 ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 용어 !! 설명 !! Oracle 대응&lt;br /&gt;
|-&lt;br /&gt;
| 클러스터 (Cluster) || 하나의 PostgreSQL 인스턴스가 관리하는 데이터베이스 모음 || 인스턴스 + DB&lt;br /&gt;
|-&lt;br /&gt;
| 튜플 (Tuple) || 테이블의 행 한 버전 || 행&lt;br /&gt;
|-&lt;br /&gt;
| 페이지 (Page) || 저장 단위 (기본 8KB) || 블록&lt;br /&gt;
|-&lt;br /&gt;
| WAL || 변경 선기록 로그 || Redo Log&lt;br /&gt;
|-&lt;br /&gt;
| VACUUM || 죽은 튜플 정리 || (Undo 자동 관리)&lt;br /&gt;
|-&lt;br /&gt;
| Bloat || 죽은 튜플로 인한 테이블·인덱스 비대화 || 단편화&lt;br /&gt;
|-&lt;br /&gt;
| 롤 (Role) || 사용자와 그룹을 통합한 권한 주체 || User / Role&lt;br /&gt;
|-&lt;br /&gt;
| 확장 (Extension) || 기능 추가 모듈 (CREATE EXTENSION) || 옵션 / 패키지&lt;br /&gt;
|-&lt;br /&gt;
| TOAST || 큰 값(약 2KB 초과)을 별도 저장하는 구조 || LOB 세그먼트&lt;br /&gt;
|-&lt;br /&gt;
| pg_hba.conf || 클라이언트 인증 설정 파일 || sqlnet.ora 접속 제어&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 13. 참고 자료 ==&lt;br /&gt;
* PostgreSQL 공식 문서 — https://www.postgresql.org/docs/&lt;br /&gt;
* PostgreSQL 공식 튜토리얼 (Documentation Part I. Tutorial)&lt;br /&gt;
* 한국 PostgreSQL 사용자 모임 — https://postgresql.kr/&lt;br /&gt;
&lt;br /&gt;
{{관련글|이전글=[[데이터 모델링 입문]]|다음글=[[SQL 튜닝 입문]]}}&lt;br /&gt;
&lt;br /&gt;
[[분류:PostgreSQL]]&lt;br /&gt;
[[분류:입문 가이드]]&lt;br /&gt;
[[분류:커리큘럼]]&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
</feed>