BI 5 — OLAP & phân tích đa chiều

13 thg 7, 2026 3 lượt xem
#bi
#analysis
#cube
#olap

OLAP là gì?

OLAP (Online Analytical Processing — xử lý phân tích trực tuyến) là một lớp công nghệ và mô hình tư duy dành cho việc phân tích dữ liệu theo nhiều chiều nhằm trả lời các câu hỏi kinh doanh. Trong khi một hệ thống ghi nhận giao dịch chỉ quan tâm tới "khách hàng A vừa rút 2 triệu lúc 9h15", thì OLAP quan tâm tới những câu hỏi tổng hợp: "Tổng dư nợ theo từng chi nhánh, từng sản phẩm, từng quý trong hai năm gần nhất diễn biến thế nào?".

Đặc trưng cốt lõi của OLAP là khả năng tổng hợp (aggregate) dữ liệu rất nhanh trên nhiều chiều (dimension) và cho phép người dùng đi sâu/đi lên theo các cấp độ chi tiết khác nhau mà không phải viết lại truy vấn từ đầu. Người phân tích có thể bắt đầu từ con số tổng toàn ngân hàng, rồi bóc tách dần xuống từng vùng, từng chi nhánh, từng tháng — tất cả trong một mạch tư duy liền lạc.

OLAP không phải là một sản phẩm cụ thể. Nó là một mô hình truy cập dữ liệu. Bạn có thể hiện thực hóa nó bằng SQL trên kho dữ liệu quan hệ, bằng một engine cube chuyên dụng, hay bằng các công cụ BI hiện đại như Power BI, Tableau, Apache Superset. Điều quan trọng là tư duy: dữ liệu được nhìn như một khối nhiều chiều, không phải như những hàng bảng riêng lẻ.

OLAP khác OLTP thế nào?

Để hiểu OLAP, cách rõ ràng nhất là đặt cạnh người anh em của nó: OLTP (Online Transaction Processing — xử lý giao dịch trực tuyến). Hệ thống core banking, ứng dụng mobile banking, máy ATM... đều là OLTP. Chúng được tối ưu để ghi nhận từng giao dịch nhỏ một cách nhanh, an toàn và nhất quán.

Tiêu chíOLTPOLAP
Mục đíchGhi nhận giao dịch nghiệp vụPhân tích, ra quyết định
Thao tác chủ đạoINSERT / UPDATE / DELETESELECT tổng hợp (aggregate)
Đơn vị truy cậpVài bản ghi mỗi lầnHàng triệu bản ghi mỗi truy vấn
Thiết kế dữ liệuChuẩn hóa cao (3NF)Phi chuẩn hóa (star/snowflake)
Số chiều phân tíchÍt, theo khóa chínhNhiều, theo dimension
Dữ liệuHiện tại, thời gian thựcLịch sử, theo lô (batch)
Người dùngKhách hàng, giao dịch viênNhà phân tích, lãnh đạo
Số người dùng đồng thờiHàng nghìn–triệuHàng chục–trăm
Tiêu chí tối ưuĐộ trễ ghi thấp, ACIDTốc độ đọc tổng hợp
Câu hỏi điển hình"Số dư tài khoản X là bao nhiêu?""Dư nợ trung bình theo vùng/quý?"

Một cách ghi nhớ ngắn gọn: OLTP trả lời "cái gì đang xảy ra với một bản ghi", OLAP trả lời "xu hướng gì đang xảy ra trên toàn bộ dữ liệu". OLTP ghi, OLAP đọc. OLTP chuẩn hóa để tránh trùng lặp khi ghi, OLAP phi chuẩn hóa để đọc nhanh khi phân tích.

Khối dữ liệu đa chiều (cube)

Trái tim của OLAP là khối dữ liệu (data cube). Hãy tưởng tượng một bảng tính, nhưng thay vì hai chiều (hàng và cột), nó có nhiều chiều. Mỗi ô trong khối chứa một số đo (measure) đã được tổng hợp sẵn, được định vị bởi tọa độ trên các chiều (dimension).

Measure và Dimension

  • Measure (số đo): là các giá trị định lượng mà ta muốn tổng hợp — ví dụ tổng dư nợ, tổng số dư, số lượng giao dịch, số tài khoản, doanh thu phí. Measure luôn là con số có thể cộng/trung bình/đếm được.
  • Dimension (chiều): là các góc nhìn để chia nhỏ measure — ví dụ thời gian, chi nhánh, sản phẩm, loại tiền tệ, phân khúc khách hàng. Dimension trả lời câu hỏi "theo cái gì?".

Một câu phân tích kinh điển có dạng: "[measure] theo [dimension 1] × [dimension 2] × ...". Ví dụ: "tổng dư nợ theo thời gian × chi nhánh × sản phẩm". Ba dimension này tạo ra một cube ba chiều, mỗi ô là tổng dư nợ tại một (tháng, chi nhánh, sản phẩm) cụ thể.

Sơ đồ trên minh họa một cube với ba chiều và một số đo. Khi người dùng "định vị" một ô — ví dụ (2025-Q1, Hà Nội, Vay tiêu dùng) — họ nhận ngay con số dư nợ đã tổng hợp sẵn cho tổ hợp đó.

Phân cấp chiều (hierarchy)

Mỗi chiều thường không phẳng mà có phân cấp (hierarchy) — tức nhiều cấp độ chi tiết xếp chồng. Đây chính là điều cho phép người dùng "đi lên, đi xuống" trong dữ liệu.

  • Chiều thời gian: Năm → Quý → Tháng → Ngày
  • Chiều địa lý / tổ chức: Quốc gia → Tỉnh/Thành → Chi nhánh
  • Chiều sản phẩm: Nhóm sản phẩm → Dòng sản phẩm → Sản phẩm cụ thể

Nhờ phân cấp, một con số "tổng dư nợ năm 2025" có thể được mở ra thành bốn quý, mỗi quý mở ra thành ba tháng, và cứ thế. Phân cấp là nền tảng cho hai thao tác quan trọng nhất của OLAP: drill-down và roll-up.

Các thao tác OLAP

Drill-down và Roll-up (theo phân cấp)

  • Roll-up (cuộn lên / tổng hợp): di chuyển lên trên phân cấp, gộp dữ liệu chi tiết thành tổng. Ví dụ: từ dư nợ theo tháng cuộn lên thành dư nợ theo quý, rồi theo năm. Số dòng giảm đi, mức tổng hợp tăng lên.
  • Drill-down (khoan xuống): ngược lại với roll-up, di chuyển xuống phân cấp để xem chi tiết hơn. Ví dụ: từ tổng dư nợ toàn quốc, khoan xuống từng tỉnh, rồi từng chi nhánh.

Hai thao tác này là cặp đối xứng. Nhà phân tích thường bắt đầu ở mức cao (roll-up tối đa để có cái nhìn tổng quan), phát hiện một bất thường, rồi drill-down vào đúng vùng đó để tìm nguyên nhân.

Slice

Slice (cắt lát) là cố định một chiều ở một giá trị cụ thể, qua đó cắt một "lát" của cube. Ví dụ: từ cube ba chiều (thời gian × chi nhánh × sản phẩm), cố định sản phẩm = "Thẻ tín dụng" sẽ thu được một mặt phẳng hai chiều (thời gian × chi nhánh) chỉ chứa dữ liệu thẻ tín dụng.

Dice

Dice (xúc xắc / chọn khối con) là chọn một tập con giá trị trên nhiều chiều để lấy ra một khối con nhỏ hơn. Ví dụ: chỉ lấy (Quý 1 và Quý 2) × (Hà Nội và Đà Nẵng) × (Vay tiêu dùng và Thẻ tín dụng). Khác với slice chỉ cố định một giá trị trên một chiều, dice tạo ra một sub-cube bằng cách lọc đồng thời nhiều chiều.

Pivot (xoay trục)

Pivot (xoay)đổi chiều hiển thị — đưa một chiều từ hàng sang cột hoặc ngược lại, để nhìn dữ liệu dưới một góc khác mà không thay đổi nội dung số liệu. Đây chính là thao tác "xoay bảng" quen thuộc trong Excel PivotTable: cùng một tập dữ liệu, lúc xem "chi nhánh theo hàng — tháng theo cột", lúc xoay thành "tháng theo hàng — chi nhánh theo cột".

Bốn thao tác này — kèm cặp drill/roll-up — tạo nên toàn bộ "ngôn ngữ tương tác" của một công cụ OLAP. Người dùng nghiệp vụ có thể khám phá dữ liệu chỉ bằng chuột, không cần viết SQL.

ROLAP, MOLAP và HOLAP

Có nhiều cách hiện thực hóa cube về mặt kỹ thuật. Ba kiến trúc kinh điển:

ROLAP (Relational OLAP)

Dữ liệu nằm trong cơ sở dữ liệu quan hệ thông thường (theo mô hình star/snowflake). Cube là "ảo" — mỗi thao tác OLAP được dịch thành câu SQL GROUP BY chạy trực tiếp trên các bảng fact và dimension.

  • Ưu: xử lý được khối dữ liệu rất lớn, không cần sao chép dữ liệu sang định dạng riêng, dùng hạ tầng DB sẵn có.
  • Nhược: truy vấn tổng hợp lớn có thể chậm nếu thiếu chỉ mục / bảng tổng hợp.

MOLAP (Multidimensional OLAP)

Dữ liệu được tính sẵn và lưu trong một cấu trúc khối đa chiều chuyên dụng (mảng nhiều chiều). Các tổ hợp tổng hợp được pre-aggregate.

  • Ưu: truy vấn cực nhanh vì kết quả đã tính trước.
  • Nhược: tốn dung lượng (hiện tượng "data explosion" khi nhiều chiều), thời gian build cube lâu, kém linh hoạt với dữ liệu thưa.

HOLAP (Hybrid OLAP)

Lai giữa hai loại trên: dữ liệu chi tiết để trong DB quan hệ (ROLAP), các tổng hợp thường dùng để trong khối đa chiều (MOLAP). Mục tiêu là cân bằng giữa tốc độ và dung lượng — truy vấn tổng hợp nhanh nhờ MOLAP, còn khi cần khoan xuống chi tiết thì rơi về ROLAP.

ROLAPMOLAPHOLAP
Lưu trữBảng quan hệKhối đa chiềuLai
Tốc độ truy vấn tổng hợpTrung bìnhRất nhanhNhanh
Khả năng mở rộng dữ liệu lớnTốtHạn chếTốt
Dung lượngThấpCaoTrung bình

Aggregation và materialized view để tăng tốc

Dù dùng kiến trúc nào, nguyên lý tăng tốc OLAP đều giống nhau: tính trước những gì hay được hỏi. Nếu mỗi sáng lãnh đạo đều xem "tổng dư nợ theo chi nhánh theo tháng", thì việc quét lại hàng chục triệu dòng giao dịch mỗi lần là lãng phí.

Materialized view (khung nhìn vật chất hóa) là một bảng kết quả của một truy vấn tổng hợp được lưu thật xuống đĩa và làm mới định kỳ. Khác với view thường (chỉ là truy vấn lưu sẵn, chạy lại mỗi lần gọi), materialized view giữ sẵn dữ liệu đã tính. Đây chính là cơ chế pre-aggregation đứng sau MOLAP và là kỹ thuật tối ưu phổ biến nhất trong kho dữ liệu.

Trong thực tế, một kho dữ liệu thường xây dựng nhiều bảng tổng hợp (summary/aggregate table) ở các mức độ chi tiết khác nhau (ví dụ: theo ngày, theo tháng, theo chi nhánh) để công cụ BI luôn truy vào bảng có mức tổng hợp gần nhất với câu hỏi — gọi là kỹ thuật aggregate navigation.

GROUP BY nâng cao trong SQL

SQL chuẩn cung cấp các phần mở rộng của GROUP BY để tạo ra nhiều mức tổng hợp trong một truy vấn — chính là công cụ ngôn ngữ để hiện thực roll-up trong ROLAP.

  • ROLLUP: tạo các tổng hợp theo phân cấp tuần tự, kèm dòng tổng cộng. GROUP BY ROLLUP(year, quarter, month) sẽ cho tổng theo (năm, quý, tháng), rồi tổng theo (năm, quý), tổng theo (năm), và tổng toàn bộ. Hợp cho các chiều phân cấp như thời gian.
  • CUBE: tạo tổng hợp cho mọi tổ hợp của các cột. GROUP BY CUBE(branch, product) cho tổng theo từng (chi nhánh, sản phẩm), theo từng chi nhánh, theo từng sản phẩm, và tổng chung. Số tổ hợp là 2^n, đắt hơn ROLLUP.
  • GROUPING SETS: cho phép chỉ định chính xác các nhóm muốn tính, linh hoạt nhất. GROUP BY GROUPING SETS ((branch), (product), ()) chỉ tính theo chi nhánh, theo sản phẩm, và tổng chung — không tính tổ hợp (chi nhánh, sản phẩm).

Quan hệ giữa chúng: ROLLUP và CUBE thực chất là các trường hợp đặc biệt, viết tắt của GROUPING SETS. Hàm GROUPING() thường đi kèm để phân biệt dòng nào là dòng tổng (subtotal) so với dòng có giá trị NULL thật.

Ví dụ ngân hàng: phân tích dư nợ đa chiều

Quay lại bài toán thực tế: phân tích số dư/dư nợ theo (thời gian × chi nhánh × sản phẩm). Trong một kho dữ liệu, ta sẽ có bảng fact fact_balance (số dư cuối kỳ) liên kết tới các bảng dimension dim_time, dim_branch, dim_product. Câu hỏi "tổng dư nợ theo chi nhánh theo tháng cho sản phẩm thẻ tín dụng" sẽ là một thao tác slice (cố định sản phẩm) + roll-up (lên mức tháng) trên cube đó.

Dưới đây là vài truy vấn roll-up đơn giản minh họa, chạy trên sandbox với ba bảng: accounts(id, customer_id, account_no, balance, currency), customers(id, full_name, city, created_at), transactions(id, account_id, amount, kind, created_at).

Tổng số dư theo loại tiền tệ (roll-up theo currency)

▶ Chạy được trong SQL Builder

SELECT currency, SUM(balance) AS total_balance, COUNT(*) AS num_accounts
FROM accounts
GROUP BY currency
ORDER BY total_balance DESC;

Đây là dạng roll-up đơn giản nhất: gộp toàn bộ tài khoản lại, tổng hợp measure SUM(balance) theo một dimension là currency.

Tổng số dư theo thành phố (roll-up theo dimension khách hàng)

▶ Chạy được trong SQL Builder

SELECT c.city, SUM(a.balance) AS total_balance
FROM accounts a
JOIN customers c ON c.id = a.customer_id
GROUP BY c.city
ORDER BY total_balance DESC;

Ở đây ta join sang dimension customers để dùng thuộc tính city làm chiều phân tích — đúng tinh thần "fact join dimension" của star schema.

Tổng số dư theo thành phố × loại tiền (cube hai chiều)

▶ Chạy được trong SQL Builder

SELECT c.city, a.currency, SUM(a.balance) AS total_balance
FROM accounts a
JOIN customers c ON c.id = a.customer_id
GROUP BY c.city, a.currency
ORDER BY c.city, a.currency;

Truy vấn này tạo một mặt cắt hai chiều (city × currency) — mỗi dòng là một ô của cube. Từ kết quả này, công cụ BI có thể pivot (xoay city/currency giữa hàng và cột), drill-down (thêm chiều), hay slice (lọc một currency).

Tổng giá trị giao dịch theo loại giao dịch (roll-up trên bảng fact giao dịch)

▶ Chạy được trong SQL Builder

SELECT kind, COUNT(*) AS num_txn, SUM(amount) AS total_amount
FROM transactions
GROUP BY kind
ORDER BY total_amount DESC;

transactions đóng vai trò gần như một fact table. Roll-up theo kind cho ta bức tranh tổng quan về cấu trúc dòng tiền (nạp, rút, chuyển khoản...).

Tóm tắt

  • OLAP là mô hình phân tích dữ liệu đa chiều, tối ưu cho đọc tổng hợp; OLTP tối ưu cho ghi giao dịch. Hai hệ thống bù trừ cho nhau.
  • Trái tim OLAP là cube, gồm các measure (số đo định lượng) định vị theo các dimension (góc nhìn). Mỗi chiều có phân cấp (Năm→Quý→Tháng→Ngày; Quốc gia→Tỉnh→Chi nhánh).
  • Bốn thao tác chính: roll-up/drill-down (đi lên/xuống phân cấp), slice (cố định một chiều), dice (chọn khối con nhiều chiều), pivot (xoay trục hiển thị).
  • Ba kiến trúc hiện thực: ROLAP (SQL trên DB quan hệ), MOLAP (khối tính sẵn), HOLAP (lai). Tốc độ đến từ pre-aggregationmaterialized view.
  • SQL hỗ trợ roll-up qua ROLLUP, CUBE, GROUPING SETS — các công cụ để tính nhiều mức tổng hợp trong một truy vấn.

Tự kiểm tra

  1. Nêu ba điểm khác biệt cơ bản giữa OLTP và OLAP về mục đích, thao tác chủ đạo và thiết kế dữ liệu.
  2. Trong cube "dư nợ theo thời gian × chi nhánh × sản phẩm", đâu là measure và đâu là các dimension? Cố định sản phẩm = "Thẻ tín dụng" là thao tác gì?
  3. Phân biệt slice và dice. Cho một ví dụ ngân hàng cho mỗi thao tác.
  4. So sánh ROLAP, MOLAP, HOLAP về cách lưu trữ và tốc độ truy vấn tổng hợp. Materialized view thuộc nguyên lý nào?
  5. GROUP BY ROLLUP(year, quarter)GROUP BY CUBE(year, quarter) cho ra các nhóm tổng hợp khác nhau như thế nào?

Đọc tiếp

BI 6 — Trực quan hoá & Dashboard

Bài viết liên quan

Phân biệt ước lượng điểm và ước lượng khoảng, cách xây khoảng tin cậy (CI) bằng margin of error z*·SE / t*·SE, đánh đổi mức 90/95/99%, và cách DIỄN GIẢI ĐÚNG khoảng tin cậy (95% CI không phải xác suất tham số nằm trong khoảng). Có CI cho trung bình và cho tỷ lệ, ảnh hưởng của cỡ mẫu, cùng ví dụ ngân hàng về tỷ lệ nợ xấu và số dư trung bình.

13 thg 7, 2026 4

Kimball dimensional modeling: bảng fact/dimension, star vs snowflake, grain, và Slowly Changing Dimension.

13 thg 7, 2026 3

Chọn biểu đồ đúng cho từng loại dữ liệu, nguyên tắc thiết kế dashboard, và kể chuyện bằng dữ liệu.

13 thg 7, 2026 3

Bản chất BI: biến dữ liệu thô thành quyết định; phân biệt báo cáo, phân tích, BI, Data Science; vai trò BI trong ngân hàng.

13 thg 7, 2026 3