PostgreSQL

Giới thiệu và Cài đặt PostgreSQL 19

PostgreSQL 19 (Beta 1 — 04/06/2026) — landmark release với SQL/PGQ graph queries, ON CONFLICT DO SELECT, GROUP BY ALL, temporal data, cùng nền tảng vững chắc từ PG 18.

1. PostgreSQL 19 — bản mới nhất (2026)

PostgreSQL 19 Beta 1 phát hành 04/06/2026 — đây là bản landmark release, đánh dấu bước tiến lớn về SQL tiêu chuẩn với khả năng truy vấn đồ thị native theo chuẩn SQL:2023. Bên cạnh đó, PG 19 mang đến hàng loạt cải tiến về atomic operations, temporal data, developer experience, và performance.

Tính năng mới trong PostgreSQL 19

SQL/PGQ — Property Graph Query

Truy vấn đồ thị (property graph) theo chuẩn SQL:2023. Định nghĩa graph view trên bảng có sẵn, dùng cú pháp MATCH pattern matching để truy vấn. Không cần storage engine mới — graph query hoạt động ngay trên relational data hiện có. Mở ra khả năng xử lý bài toán recommendation, fraud detection, network analysis ngay trong Postgres mà không cần Neo4j hay TigerGraph.

ON CONFLICT DO SELECT

Hành động thứ 3 sau DO NOTHINGDO UPDATE. Atomic get-or-create: nếu row tồn tại thì trả về nguyên bản, nếu không thì insert và trả về. Nhanh hơn 4x so với DO UPDATE SET id=id ... RETURNING * workaround vì không tạo dead tuple, không cần HOT cleanup. Pattern cực kỳ phổ biến trong API idempotency và upsert logic.

FOR PORTION OF — Temporal Data

UPDATE/DELETE FOR PORTION OF cho phép thao tác dữ liệu trong khoảng thời gian chỉ định trên temporal table. Hệ thống tự động split row tại biên thời gian — ví dụ: cập nhật lương nhân viên chỉ trong Q2/2026 mà không ảnh hưởng các khoảng thời gian khác. Chuẩn SQL:2011, nền tảng cho hệ thống lưu trữ lịch sử dữ liệu doanh nghiệp.

GROUP BY ALL

Tự động GROUP BY tất cả cột không phải aggregate trong SELECT. Thay vì phải liệt kê thủ công từng cột, chỉ cần viết GROUP BY ALL — code gọn hơn, tránh lỗi thiếu cột khi thêm/sửa SELECT list. Đặc biệt hữu ích trong BI query có nhiều dimension column.

IGNORE NULLS — Window Functions

lead(), lag(), first_value(), last_value(), nth_value() giờ hỗ trợ IGNORE NULLS — bỏ qua giá trị NULL khi duyệt window frame. Ví dụ: lấy ngày giao dịch gần nhất không NULL trong chuỗi thời gian, hay điền giá trị missing từ dòng trước/sau. Không cần subquery phức tạp để lọc NULL.

JSON COPY TO

COPY TO hỗ trợ xuất NDJSON (newline-delimited JSON) native. Tùy chọn FORCE_ARRAY để xuất JSON array thay vì từng dòng riêng lẻ. Export dữ liệu dạng JSON trực tiếp từ Postgres mà không cần json_agg() hay tool ETL bên ngoài — lý tưởng cho data pipeline và API feed.

REPACK — VACUUM FULL + CLUSTER

Kết hợp VACUUM FULL (thu hồi disk space) và CLUSTER (sắp xếp vật lý theo index) trong một lệnh duy nhất. Chế độ CONCURRENTLY cho phép chạy online — không khóa bảng, không downtime. Giải pháp toàn diện cho bảng bị bloat nặng mà vẫn phục vụ traffic.

Parallel Autovacuum

Autovacuum có thể dùng nhiều worker để vacuum index đồng thời trên các bảng nhiều index. Trước đây vacuum index là single-threaded, dễ thành bottleneck trên bảng có 10+ index với write-heavy workload. Default: bật sẵn vacuum_uses_parallel_indexes.

pg_plan_advice — Official Plan Hints

Contrib module chính thức cho query plan hints. Cho phép tạo advice từ execution plan tốt và lock plan để đảm bảo query plan ổn định qua các lần upgrade/statistics change. Thay thế extension pg_hint_plan — giờ đã có giải pháp chính chủ, được maintain cùng core.

Những cải tiến khác trong PG 19

  • Online Data Checksums: Bật/tắt data checksums trên cluster đang chạy — không cần restart, không cần pg_checksums offline.
  • 64-bit MultiXactOffset: Loại bỏ giới hạn wraparound 4 tỷ member — hệ thống có transaction rate cực cao không còn lo MultiXactID exhaustion.
  • Memoize estimates trong EXPLAIN: EXPLAIN ANALYZE hiển thị ước lượng cache hit % cho Memoize node — dễ đánh giá hiệu quả cache parameterized query.
  • pg_get_*_ddl() functions: API chính thức để trích xuất DDL — pg_get_table_ddl(), pg_get_index_ddl(), pg_get_function_ddl(), v.v.
  • pg_dumpall non-text formats: pg_dumpall hỗ trợ custom, directory, tar format — backup toàn cluster nhanh và gọn hơn.
  • Logical Replication cải tiến: Đồng bộ sequence, EXCEPT TABLE trong publication, dynamic WAL level.

Breaking changes — Lưu ý khi nâng cấp lên PostgreSQL 19

Những thay đổi có thể ảnh hưởng khi upgrade từ PG 18 (hoặc cũ hơn):
  • JIT tắt mặc định (jit = off) — giảm overhead compilation cho OLTP. Nếu bạn dùng JIT cho analytical query phức tạp, cần enable lại thủ công.
  • LZ4 TOAST compression mặc định thay pglz — default_toast_compression = lz4. Nén nhanh hơn, ít CPU hơn. Cột TOAST cũ (pglz) vẫn đọc được bình thường, không cần migrate.
  • RADIUS authentication bị loại bỏ — nếu đang dùng RADIUS, phải chuyển sang LDAP hoặc OAuth trước khi upgrade.
  • standard_conforming_strings bắt buộc = on\t trong string literal là ký tự tab, không còn là \t text. Backslash trong string literal luôn là escape character.
  • MD5 deprecated (warning, không error) — chuyển hẳn password_encryption = scram-sha-256.
  • max_locks_per_transaction tăng gấp đôi (64→128) — shared memory tăng tương ứng. Nếu đang chạy instance nhỏ (dưới 2GB shared_buffers), kiểm tra lại tổng memory.
  • log_lock_waits bật mặc định — log tự động khi transaction chờ lock quá deadlock_timeout (thường 1s). Có thể gây nhiễu log nếu app thường xuyên chờ lock ngắn.

PostgreSQL 18 — nền tảng hiện tại (09/2025)

PostgreSQL 18 phát hành 25/09/2025 vẫn là bản stable được dùng rộng rãi nhất. Những cải tiến cốt lõi từ PG 18 tạo nền tảng cho PG 19:

Async I/O subsystem

Subsystem AIO mới — đọc storage nhanh tới 3x. Cải thiện sequential scan, bitmap heap scan, VACUUM, các operation IO-heavy. PG 19 kế thừa và mở rộng thêm io_method parameter.

uuidv7()

Function built-in sinh UUID theo timestamp — giải pháp tuyệt vời cho ID có sort được theo thời gian. Thay thế uuid_generate_v4() khi cần primary key time-ordered.

Virtual generated columns

Generated column tính khi đọc (không lưu vật lý) — giờ là default. Tiết kiệm storage cho cột derived. Ví dụ: amount_with_tax NUMERIC GENERATED ALWAYS AS (amount * 1.1) VIRTUAL.

OLD/NEW trong RETURNING

INSERT/UPDATE/DELETE/MERGE returning được cả OLDNEW — audit log dễ hơn rất nhiều, không cần trigger để bắt giá trị trước/sau.

B-tree Skip Scan

Multicolumn B-tree index dùng được cho query không có cột đầu tiên — optimizer có thể skip-scan thay vì sequential scan. Giảm số lượng index cần tạo.

OAuth authentication

Native OAuth — login bằng Google, GitHub, Azure AD, custom OIDC provider mà không cần extension bên thứ ba. Tích hợp trực tiếp vào pg_hba.conf.

Version policy

Postgres release major version mỗi năm (tháng 9). Support 5 năm mỗi version.

VersionReleaseEOL
1909/2026 (dự kiến)11/2031
1809/202511/2030
1709/202411/2029
1609/202311/2028
1510/202211/2027
Học/dev: PG 19 là tương lai — học ngay các feature mới như SQL/PGQ, ON CONFLICT DO SELECT, GROUP BY ALL. Production: PG 18 (stable, battle-tested). Nếu công ty đang dùng bản cũ (15/16/17), 90% kiến thức SQL, indexing, transaction như nhau — chỉ thiếu feature mới.

2. Cài đặt — 3 cách

Cách 1 (khuyên dùng) — Docker

# PostgreSQL 19 (mới nhất, đang Beta)
docker run --name pg19 \
  -e POSTGRES_PASSWORD=mysecretpw \
  -e POSTGRES_DB=learnpg \
  -p 5432:5432 \
  -v pgdata19:/var/lib/postgresql/data \
  -d postgres:19-beta1

# PostgreSQL 18 (stable cho production)
docker run --name pg18 \
  -e POSTGRES_PASSWORD=mysecretpw \
  -e POSTGRES_DB=learnpg \
  -p 5433:5432 \
  -v pgdata18:/var/lib/postgresql/data \
  -d postgres:18-alpine

Kết nối: localhost:5432 (PG 19) hoặc localhost:5433 (PG 18), user postgres, password mysecretpw.

Nếu đang học, khuyên dùng PG 19 Beta để làm quen feature mới. Nếu làm project thực tế, dùng PG 18 stable. PG 19 GA dự kiến tháng 9/2026.

Cách 2 — Native install

  • Windows: tải từ enterprisedb.com/downloads/postgres-postgresql-downloads, installer kèm pgAdmin.
  • macOS: brew install postgresql@18 (hoặc postgresql@19 khi GA).
  • Ubuntu/Debian:
    sudo apt install -y postgresql-common
    sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
    sudo apt install -y postgresql-18   # Stable
    # sudo apt install -y postgresql-19 # Khi GA
    

Cách 3 — Managed cloud

  • Supabase (free tier hào phóng, có dashboard, hiện đang chạy PG 15/17).
  • Neon (serverless Postgres, free tier, thường cập nhật version mới nhanh nhất).
  • AWS RDS / Azure Database for PostgreSQL / Google Cloud SQL.

3. Tool quản lý

ToolPlatformGhi chú
pgAdmin 4AllChính chủ, free, web/desktop. Hỗ trợ PG 19.
DBeaverAllFree, đa DB, query plan visual.
TablePlusMac/Win/LinuxUI đẹp nhất, free version giới hạn tab.
DataGripAllJetBrains, trả phí, smartest.
psqlAllCLI chính thức — học tốt nó là điểm cộng PV.

4. psql CLI — phải biết

# Kết nối
psql -h localhost -p 5432 -U postgres -d learnpg

# Connection string
psql "postgresql://postgres:mysecretpw@localhost:5432/learnpg"

Meta-command (chỉ trong psql)

LệnhTác dụng
\lList database
\c dbnameConnect db
\dtList table
\d tableDescribe table
\diList index
\dfList function
\duList user/role
\dnList schema
\dxList extension
\timingBật/tắt đo thời gian query
\xToggle expanded display
\qQuit
\?Help meta-commands
\h SELECTHelp SQL syntax
Câu PV nhỏ nhưng hay:"Trong psql, lệnh nào liệt kê bảng?" -> \dt. Biết được psql nâng tầm fresher lên junior+ trong mắt phỏng vấn.

5. Tạo database đầu tiên

-- Trong psql
CREATE DATABASE learnpg WITH ENCODING 'UTF8';
\c learnpg

CREATE TABLE greetings (
    id BIGSERIAL PRIMARY KEY,
    text TEXT NOT NULL,
    created_at TIMESTAMPTZ DEFAULT NOW()
);

INSERT INTO greetings (text) VALUES ('Xin chào PostgreSQL 19!');

SELECT * FROM greetings;
Câu PV:"Làm sao để atomic get-or-create trong Postgres?"

Trước PG 19, pattern phổ biến là INSERT ... ON CONFLICT DO UPDATE SET id = id RETURNING * — nhưng cách này tạo dead tuple và chậm. Từ PG 19, dùng INSERT ... ON CONFLICT DO SELECT — nhanh hơn 4x, không dead tuple, là giải pháp chính thức cho idempotency.

Postgres conventions khác SQL Server:
  • Lower snake_case cho table/column (chuẩn cộng đồng).
  • TEXT thay vì VARCHAR(MAX) — không có giới hạn, perf giống VARCHAR(n).
  • BIGSERIAL = BIGINT GENERATED BY DEFAULT AS IDENTITY (cú pháp ngắn).
  • TIMESTAMPTZ — luôn có timezone, lưu UTC.
  • NOW() thay vì GETDATE().
  • Identifier với "", không [].

6. Cấu hình ban đầu

postgresql.conf — tham số quan trọng

Tham sốÝ nghĩaKhởi điểm (8GB RAM)
shared_buffersMemory cho data cache2GB (25% RAM)
effective_cache_sizeHint planner về OS cache6GB (75% RAM)
work_memMemory mỗi query/sort32MB–64MB
maintenance_work_memCho VACUUM, INDEX, ALTER512MB
max_connectionsSố connection đồng thời100 (dev), tăng cẩn thận
wal_levelMức WAL logreplica hoặc logical

Tham số mới hoặc thay đổi mặc định trong PG 19

Tham sốMặc định PG 18Mặc định PG 19Ý nghĩa
jitonoffJIT compilation tắt mặc định — giảm overhead OLTP
default_toast_compressionpglzlz4TOAST nén LZ4 nhanh hơn, ít CPU hơn
io_method(không có)workerPhương thức async I/O từ PG 18 AIO subsystem
max_locks_per_transaction64128Tăng gấp đôi — giảm lỗi "out of shared memory"
log_lock_waitsoffonTự động log khi transaction chờ lock > deadlock_timeout

pg_hba.conf — authentication

# TYPE  DATABASE  USER  ADDRESS         METHOD
host    all       all   0.0.0.0/0       scram-sha-256
Từ PG 19, MD5 deprecated — dùng scram-sha-256 cho tất cả connection mới. Nếu đang migrate từ bản cũ, cập nhật password_encryption = scram-sha-256.

Reload sau khi sửa:

SELECT pg_reload_conf();

7. Schema & role

-- Postgres database có nhiều schema (mặc định: public)
CREATE SCHEMA shop;
SET search_path TO shop, public;

-- Tạo role + grant
CREATE ROLE app_user WITH LOGIN PASSWORD 'apppwd';
GRANT CONNECT ON DATABASE learnpg TO app_user;
GRANT USAGE ON SCHEMA shop TO app_user;
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA shop TO app_user;
Câu PV:"Schema khác Database thế nào trong Postgres?"

"Postgres có cluster -> database -> schema -> table. Mỗi database hoàn toàn tách biệt (không JOIN cross-database trực tiếp được). Schema giống namespace bên trong database. public là default schema. SQL Server thì DB = schema container, không có khái niệm cluster."

8. Extensions — sức mạnh thực sự của Postgres

-- Xem extension có sẵn
SELECT * FROM pg_available_extensions ORDER BY name;

-- Install
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";           -- UUID generator (uuid_generate_v4)
CREATE EXTENSION IF NOT EXISTS pg_trgm;               -- fuzzy search, similarity
CREATE EXTENSION IF NOT EXISTS pgcrypto;              -- crypto, hash, gen_random_uuid
CREATE EXTENSION IF NOT EXISTS postgis;               -- GIS, geometry, geography
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;    -- query monitoring
CREATE EXTENSION IF NOT EXISTS vector;                -- pgvector cho AI embedding (cần install riêng)
Câu PV:"Postgres có gì hơn MySQL?"

"Extension system + JSONB + array type + window function đầy đủ + MVCC native. Đặc biệt: PostGIS cho GIS, pgvector cho AI embedding, pg_trgm cho fuzzy search. PG 19 thêm SQL/PGQ graph query native — không cần graph database riêng."

PG 19 có thêm contrib module mới:pg_plan_advice (official plan hints) — tạo và lock query plan ổn định. Nếu đang dùng pg_hint_plan extension, cân nhắc chuyển sang giải pháp chính thức này.

9. Đặc thù Postgres cần biết ngay

  • String quote: chỉ ' cho string, " cho identifier.
  • Concat: || (vs + của SQL Server).
  • Cast: value::type (gọn) hoặc CAST(value AS type) (chuẩn ANSI).
  • Boolean: kiểu BOOLEAN thật (TRUE/FALSE/NULL), không phải BIT.
  • Auto-increment: BIGSERIAL hoặc BIGINT GENERATED ALWAYS AS IDENTITY.
  • Limit: LIMIT N OFFSET M.
  • Now: NOW(), CURRENT_TIMESTAMP.
  • Default schema: public.
  • Case sensitivity: identifier KHÔNG quote -> lowercase. "User" khác User.
  • Lệnh kết thúc: ;. Không có GO.
  • PG 19: GROUP BY ALL thay cho liệt kê cột thủ công.
  • PG 19: ON CONFLICT DO SELECT cho atomic get-or-create thay DO UPDATE workaround.

10. Nâng cấp từ PostgreSQL 18 lên 19

Lộ trình nâng cấp khuyên dùng:
  1. Audit extension — kiểm tra extension nào chưa tương thích PG 19 (đặc biệt pg_hint_plan, RADIUS auth module).
  2. Kiểm tra MD5 — đổi tất cả password sang SCRAM-SHA-256: ALTER ROLE ... PASSWORD '...' trước khi upgrade.
  3. Test pg_upgrade trên bản sao: pg_upgrade --old-bindir /usr/lib/postgresql/18/bin --new-bindir /usr/lib/postgresql/19/bin --old-datadir ... --new-datadir ...
  4. JIT plan — nếu OLTP, để jit = off (default mới). Nếu analytical workload, bật lại jit = on.
  5. LZ4 TOAST — cột TOAST cũ vẫn đọc được. Dùng ALTER TABLE ... ALTER COLUMN ... SET COMPRESSION lz4 để chuyển đổi dần.
  6. Theo dõi log_lock_waits — nay bật mặc định, review log để phát hiện lock contention tiềm ẩn.
Thời gian nâng cấp: pg_upgrade thường < 5 phút với database < 100GB (không tính thời gian backup trước upgrade).

© 2026 .NET Fresher Guide. All rights reserved.

Về Trang Web

Hướng dẫn toàn diện để chuẩn bị phỏng vấn vị trí .NET Fresher với nội dung từ lý thuyết đến thực hành.