SQL
76 bài viết
RDBMS là gì, bảng/cột/hàng, khoá chính & khoá ngoại, kiểu dữ liệu và câu SELECT đầu tiên.
Lọc, sắp xếp, gộp nhóm và hàm tổng hợp — nền tảng mọi truy vấn phân tích.
Kết nhiều bảng đúng cách: các loại JOIN, bẫy thường gặp và phép hợp tập.
Truy vấn lồng, CTE (WITH), CTE đệ quy và hàm cửa sổ — vũ khí cho phân tích nâng cao.
Khoá, ràng buộc, quan hệ và chuẩn hoá 1NF/2NF/3NF — thiết kế lược đồ đúng từ đầu.
Cách index hoạt động (B-Tree), đọc EXPLAIN, seq scan vs index scan và mẫu tối ưu truy vấn.
Giao dịch, 4 thuộc tính ACID, các mức cô lập, hiện tượng đồng thời, lock và MVCC.
Công việc DBA: phân quyền, sao lưu/phục hồi, giám sát, bảo trì, nhân bản & sẵn sàng cao.
PostgreSQL, MySQL, SQL Server, Oracle, SQLite và NoSQL (MongoDB, Redis): khác biệt và khi nào dùng.
GROUPING SETS/ROLLUP/CUBE, recursive CTE, LATERAL join, FILTER và mẹo viết truy vấn phân tích.
date_trunc/extract/age, cộng trừ khoảng thời gian, hàm chuỗi, ép kiểu CAST, COALESCE/NULLIF và làm tròn.
Kiểu JSON/JSONB của PostgreSQL, toán tử truy cập, hàm json, index GIN và khi nào dùng JSON vs cột quan hệ.
Running total, moving average, phần trăm thay đổi, xếp hạng theo nhóm, top-N mỗi nhóm và cohort bằng SQL.
Nền tảng của mọi việc tối ưu: cách trình tối ưu (planner) chọn kế hoạch, đọc EXPLAIN / EXPLAIN ANALYZE, ý nghĩa các node (Seq Scan, Index Scan, Nested Loop, Hash Join, Sort), cost vs actual, và vai trò của thống kê (ANALYZE).
Chỉ mục hoạt động ra sao và dùng đúng cách: B-tree, chỉ mục nhiều cột (thứ tự cột quan trọng), covering/INCLUDE cho index-only scan, partial index, expression index, GIN/GiST cho JSON/full-text, và cái giá của chỉ mục khi ghi.
Kỹ thuật viết lại truy vấn để planner dùng được index và giảm dữ liệu quét: predicate sargable, tránh hàm trên cột, EXISTS vs IN, join vs subquery, phân trang keyset thay OFFSET, tránh SELECT *, và diệt N+1.
Nhìn vào đâu để biết CSDL đang 'ốm': pg_stat_statements tìm truy vấn tốn nhất, pg_stat_activity xem phiên đang chạy, wait events, khóa & deadlock (pg_locks), idle-in-transaction, cache hit ratio, và bloat bảng/chỉ mục.
Công việc DBA giữ CSDL khoẻ: MVCC & VACUUM/autovacuum chống bloat, ANALYZE cập nhật thống kê, reindex, các tham số bộ nhớ then chốt (shared_buffers, work_mem, effective_cache_size), connection pooling (PgBouncer), checkpoint/WAL và backup/PITR.
Nhân bản dữ liệu để chịu tải và chịu lỗi: streaming replication dựa trên WAL (physical) vs logical replication (publication/subscription), đồng bộ vs bất đồng bộ, replication lag, và các mô hình HA/failover (Patroni, replication slot, quorum).
Mở rộng khả năng đọc bằng cách dồn ghi về primary và phân tán đọc sang các replica: cách định tuyến (tầng ứng dụng vs proxy như PgBouncer/HAProxy/Pgpool), xử lý replication lag & read-your-writes, và khi nào buộc đọc từ primary.
Khi một máy không đủ: table partitioning (range/list/hash) và partition pruning để quản lý bảng khổng lồ, sharding để scale ghi, so sánh scale-up vs scale-out, và cách ghép replica + partition + sharding thành kiến trúc dữ liệu chịu tải.
PostgreSQL là gì và mạnh ở đâu, kiến trúc tiến trình (postmaster, backend mỗi kết nối, background workers), bộ nhớ (shared_buffers, WAL), vòng đời một truy vấn, và tổng quan MVCC — nền tảng để hiểu các bài sau.
Điều khiến PostgreSQL khác biệt: kho kiểu dữ liệu giàu có — numeric/text chuẩn, mảng (array), range/multirange, UUID, ENUM, network (inet/cidr), timestamp có/không timezone, và cách tạo domain/custom type; kèm ép kiểu (cast).
PostgreSQL vừa là RDBMS vừa là document store: khác biệt json vs jsonb, các toán tử truy cập (->, ->>, #>, @>, ?), jsonpath, hàm dựng/biến đổi JSONB, đánh index GIN, và khi nào nên dùng JSONB thay cho cột quan hệ.
Các tính năng SQL mạnh của PostgreSQL: CTE và recursive CTE, window functions, LATERAL join, GROUPING SETS/ROLLUP/CUBE, DISTINCT ON, UPSERT (INSERT ... ON CONFLICT), RETURNING và generate_series.
Đưa logic vào trong CSDL: viết function và procedure bằng PL/pgSQL (biến, điều khiển luồng, vòng lặp, xử lý ngoại lệ), sự khác nhau function vs procedure, trigger & trigger function, và khi nào NÊN/KHÔNG NÊN đặt logic ở tầng DB.
Sức mạnh lớn nhất của PostgreSQL là khả năng cắm thêm: CREATE EXTENSION và các extension quan trọng — pg_stat_statements, pgvector (AI/embeddings), PostGIS, pg_trgm, postgres_fdw, TimescaleDB, Citus, pg_partman, uuid-ossp/pgcrypto.
Tìm kiếm văn bản ngay trong Postgres: tsvector/tsquery, toán tử @@, xếp hạng ts_rank, index GIN, dictionary/cấu hình ngôn ngữ, tìm kiếm mờ với pg_trgm, và so sánh khi nào đủ dùng vs cần Elasticsearch.
Cách PostgreSQL cho nhiều giao dịch chạy song song mà vẫn nhất quán: MVCC và version dòng (xmin/xmax), ba mức cách ly (Read Committed, Repeatable Read, Serializable/SSI), các hiện tượng bất thường, khóa dòng (FOR UPDATE, SKIP LOCKED) và advisory lock.
Kiến trúc Oracle Database: phân biệt instance vs database, vùng nhớ SGA/PGA, các tiến trình nền (SMON, PMON, DBWn, LGWR, CKPT), redo/undo, tablespace/datafile và kiến trúc đa thuê bao CDB/PDB (multitenant).
Ngôn ngữ thủ tục mạnh của Oracle: cấu trúc block, procedure/function/package, cursor (implicit/explicit/ref), xử lý ngoại lệ, tối ưu bằng BULK COLLECT/FORALL, và trigger.
Những tính năng SQL mạnh của Oracle: hàm phân tích (analytic/window), truy vấn phân cấp CONNECT BY, MERGE (upsert), ROWNUM/ROWID & phân trang, sequence, và giới thiệu hint tối ưu.
Tối ưu hiệu năng Oracle: bộ tối ưu chi phí (CBO) & thống kê, đọc execution plan bằng EXPLAIN PLAN/DBMS_XPLAN/SQL Monitor, chỉ mục B-tree vs bitmap, và công cụ chẩn đoán AWR/ASH cùng hint.
Quản lý bảng khổng lồ trong Oracle: partitioning (range/list/hash/composite), partition pruning, index-organized table, nén dữ liệu, ASM, và cấu trúc segment/extent/block.
Cách Oracle xử lý đồng thời: đọc nhất quán (read consistency) nhờ undo, các mức cách ly (Read Committed, Serializable, Read-Only), khóa dòng, các lỗi ORA thường gặp, và tính năng Flashback.
Kiến trúc sẵn sàng cao của Oracle: RAC (nhiều instance dùng chung một database) để chịu lỗi & mở rộng, Data Guard (standby vật lý/luận lý) cho DR, và RMAN cho sao lưu/khôi phục.
Quản trị an toàn Oracle: user/role/privilege & profile, mã hoá TDE, kiểm toán (audit) và Unified Auditing, che dữ liệu (VPD/Data Redaction), cùng khai thác dữ liệu ra ngoài (CDC/GoldenGate) cho data warehouse.
BigQuery là kho dữ liệu phân tích serverless của Google Cloud: tách biệt lưu trữ (Colossus) và tính toán (Dremel/slots), truy vấn petabyte bằng SQL, mô hình không cần quản trị hạ tầng, và khi nào nên dùng.
Cách BigQuery lưu dữ liệu: định dạng cột Capacitor trên Colossus, các loại bảng (native, external/BigLake, partitioned, clustered), dataset & region, cùng views và materialized views.
Những tính năng SQL mạnh của BigQuery: kiểu lồng nhau ARRAY & STRUCT cùng UNNEST, hàm phân tích/window, wildcard & _TABLE_SUFFIX, scripting & procedural, cùng DDL/DML và MERGE.
Giảm dữ liệu quét = giảm chi phí & tăng tốc: phân vùng bảng (theo thời gian, ingestion-time, integer range), clustering (sắp xếp theo cột), partition pruning, và cách phối hợp cả hai cho bảng lớn.
Kiểm soát tiền và tăng tốc trên BigQuery: hai mô hình giá (on-demand theo byte quét vs capacity/slots), giảm byte quét (partition/cluster, tránh SELECT *), materialized views & BI Engine, và đọc query plan.
Đưa dữ liệu vào BigQuery: batch load (GCS/local), external/federated queries, streaming (Storage Write API vs legacy streaming inserts), Data Transfer Service & Dataflow, và mẫu ELT với dbt trên BigQuery.
Hoàn thiện bức tranh BigQuery: phân quyền IAM & authorized views, bảo mật cột/hàng (column/row-level security), BigQuery ML để huấn luyện mô hình bằng SQL, và vận hành (INFORMATION_SCHEMA, giám sát, tích hợp BI/ML).
ClickHouse là cơ sở dữ liệu cột (column-store) mã nguồn mở tối ưu cho phân tích tốc độ cao trên hàng tỷ dòng. Bài này dựng mô hình tinh thần về OLAP vs OLTP, giải thích vì sao lưu trữ cột và vector execution khiến aggregate cực nhanh, định vị ClickHouse so với BigQuery/Snowflake và PostgreSQL, và chỉ rõ khi nào NÊN và KHÔNG NÊN dùng.
Cách ClickHouse lưu dữ liệu theo cột trên đĩa: mỗi cột một file .bin, nén LZ4/ZSTD và codec chuyên biệt, part immutable + merge nền, granule và sparse primary index qua mark file. Giải thích vì sao quét analytic cực nhanh và khác gì B-tree của OLTP.
MergeTree là trái tim của ClickHouse: ORDER BY quyết định sắp xếp và primary key thưa, PARTITION BY để prune và quản lý TTL. Bài này giải thích cơ chế insert→part→merge, các biến thể Replacing/Summing/Aggregating/Collapsing, TTL cho retention, và bẫy 'merge bất định' khi đọc dữ liệu chưa gộp.
Cách đưa dữ liệu vào ClickHouse cho đúng: INSERT theo lô lớn thay vì nhiều insert nhỏ, async insert, nạp từ file/URL/S3 với các format CSV/JSONEachRow/Parquet, và ingest streaming từ Kafka qua Kafka engine + Materialized View. Kèm nguyên tắc thiết kế schema OLAP: chọn kiểu hẹp, LowCardinality, hạn chế Nullable, denormalize và dùng dictionary.
ClickHouse nói SQL gần ANSI nhưng mở rộng bằng kho hàm tổng hợp cực mạnh: uniq/quantile xấp xỉ, combinator -If/-State/-Merge, topK, argMax, arrayJoin. Bài này còn giải thích điểm khác biệt lớn nhất — Materialized View là trigger lúc INSERT đẩy rollup incremental vào AggregatingMergeTree — và projections như một chỉ mục thay thế trong bảng.
Cách ClickHouse mở rộng ngang: ReplicatedMergeTree đồng bộ dữ liệu giữa các replica qua ClickHouse Keeper/ZooKeeper để bền vững và đọc HA; sharding chia dữ liệu theo nhiều node; Distributed engine định tuyến truy vấn scatter-gather tới các shard. Bài giải thích cluster config, sharding key, insert idempotent, GLOBAL IN/JOIN và đánh đổi nhất quán eventual — trên bối cảnh cụm phân tích log/giao dịch nhiều node.