Product Management
Đăng nhập
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Bài 17 — Data Warehouse — BigQuery, Redshift, Snowflake

Đã đọc 0/14 mục · còn khoảng 12 phút
Cách chúng tôi ghi nhận

Một mục được tính là đã đọc khi nó nằm giữa màn hình đủ lâu so với độ dài của nó (bảng và sơ đồ tính một nửa), bạn vẫn đang cuộn hoặc bấm phím, và bạn đã thấy tới cuối mục. Lướt nhanh hoặc để tab mở không được tính. Chúng tôi chỉ lưu thời gian đọc từng mục — không lưu gì khác.

Mở đầu — vì sao bài này quan trọng

Hãy tưởng tượng bạn đang làm data analyst cho một sàn thương mại điện tử tại Việt Nam. Sáng thứ Hai, sếp nhắn: "Cho anh doanh thu theo từng danh mục sản phẩm, chia theo 63 tỉnh thành, trong 24 tháng qua, so sánh với cùng kỳ năm trước." Bạn mở database MySQL đang chạy cho website, viết một câu query GROUP BY, bấm chạy... và ngồi chờ. Năm phút, mười phút. Query vẫn quay. Trong lúc đó, website bắt đầu ì ạch vì câu truy vấn "khủng" của bạn đang ngốn hết tài nguyên của cái database mà cả hệ thống bán hàng đang phụ thuộc.

Đây chính là khoảnh khắc bạn nhận ra: database phục vụ giao dịch (OLTP) và database phục vụ phân tích (OLAP) là hai loài khác nhau. Cái database MySQL/PostgreSQL tuyệt vời cho việc "thêm một đơn hàng", "cập nhật tồn kho", "đọc thông tin một khách hàng" — những thao tác nhỏ, nhanh, nhiều lần mỗi giây. Nhưng nó không sinh ra để quét hàng trăm triệu dòng và tổng hợp lại thành một con số.

Data Warehouse (kho dữ liệu) ra đời để giải quyết đúng bài toán đó. Trong hệ sinh thái cloud, ba cái tên bạn sẽ nghe đi nghe lại là BigQuery (Google), Redshift (AWS) và Snowflake (nhà cung cấp độc lập, chạy trên cả ba cloud). Bài này giúp bạn hiểu bản chất tại sao data warehouse nhanh đến vậy, ba "ông lớn" khác nhau ở đâu, và quan trọng nhất: khi nào bạn thực sự cần đến chúng thay vì cố gắng "ép" một database giao dịch làm việc phân tích.

Khái niệm cốt lõi

OLTP vs OLAP — hai thế giới xử lý dữ liệu

OLTP (Online Transaction Processing) là thế giới của các giao dịch: đặt hàng, chuyển khoản, đăng nhập. Đặc trưng là nhiều thao tác nhỏ, đọc/ghi vài dòng, cần độ trễ cực thấp và tính nhất quán cao. MySQL, PostgreSQL, SQL Server là những "công dân" tiêu biểu.

OLAP (Online Analytical Processing) là thế giới của phân tích: tính tổng, đếm, trung bình, phân nhóm trên khối dữ liệu khổng lồ. Ở đây, một câu query có thể phải quét hàng tỷ dòng, nhưng bạn chỉ chạy nó vài chục lần mỗi ngày, và chấp nhận chờ vài giây đến vài chục giây. Data warehouse được thiết kế riêng cho thế giới OLAP.

Điểm mấu chốt: bạn không thay thế OLTP bằng OLAP. Chúng bổ trợ nhau. Dữ liệu được sinh ra ở OLTP (đơn hàng thật), rồi được sao chép/chuyển hóa sang OLAP để phân tích — mà không làm phiền hệ thống giao dịch.

Vì sao data warehouse nhanh đến vậy? Hai bí quyết kỹ thuật

Bí quyết 1 — Columnar storage (lưu trữ theo cột).

Database giao dịch truyền thống lưu dữ liệu theo hàng: toàn bộ thông tin của một đơn hàng (mã đơn, khách hàng, sản phẩm, giá, ngày) nằm cạnh nhau trên đĩa. Cách này hoàn hảo khi bạn cần đọc trọn vẹn một đơn hàng.

Nhưng khi phân tích, câu hỏi thường là: "tổng cột giá của tất cả đơn hàng". Nếu lưu theo hàng, hệ thống phải đọc qua cả mã đơn, khách hàng, sản phẩm... chỉ để lấy đúng cột giá. Rất lãng phí.

Data warehouse lưu theo cột: tất cả giá trị của cột giá nằm liền nhau. Muốn tính tổng cột giá? Chỉ đọc đúng khối dữ liệu đó, bỏ qua mọi cột khác. Với một bảng 200 cột mà query chỉ dùng 3 cột, bạn tiết kiệm được lượng I/O khổng lồ. Chưa kể dữ liệu cùng cột thường giống nhau (ví dụ cột tỉnh_thành chỉ có 63 giá trị lặp lại), nên nén (compression) rất hiệu quả — tiết kiệm cả dung lượng lẫn tốc độ đọc.

Bí quyết 2 — MPP (Massively Parallel Processing).

Thay vì một máy chủ gồng gánh cả câu query, data warehouse chia dữ liệu ra hàng chục, hàng trăm node và cho chúng xử lý song song. Mỗi node quét một phần dữ liệu, tính kết quả cục bộ, rồi hệ thống gộp lại. Một query quét 1 tỷ dòng, chia cho 100 node, mỗi node chỉ lo 10 triệu dòng — xong trong vài giây. Đây là lý do data warehouse "nuốt" được khối lượng mà database đơn lẻ phải bó tay.

Kết hợp columnar + MPP chính là công thức khiến một câu query tổng hợp trên hàng trăm triệu dòng chạy trong thời gian mà bạn kịp uống một ngụm cà phê.

Ba "người chơi" chính

Tiêu chíBigQuery (Google)Redshift (AWS)Snowflake
Mô hìnhServerless hoàn toànCluster (có bản serverless)Tách compute/storage
Quản lý hạ tầngKhông cầnCần cấu hình node (bản cổ điển)Tối thiểu
Tính giáTheo lượng dữ liệu quét (on-demand) hoặc slotTheo giờ chạy clusterTheo giây compute + lưu trữ
Đa cloudChỉ GCPChỉ AWSChạy trên AWS/Azure/GCP
Điểm mạnhNhanh setup, tích hợp GA4/data GoogleTích hợp sâu hệ AWSLinh hoạt, chia sẻ dữ liệu
BigQuery nổi bật vì gần như không cần quản lý gì: bạn nạp dữ liệu lên, viết SQL, chạy. Không có server để bật/tắt. Tính tiền phổ biến theo lượng dữ liệu mà query quét — nghĩa là query quét càng ít cột, càng ít dữ liệu thì càng rẻ. Cực hợp với đội nhỏ, và tích hợp thẳng với Google Analytics 4.

Redshift là data warehouse "gốc" của AWS, gắn chặt với hệ sinh thái S3, Glue, QuickSight. Bản cổ điển bạn phải chọn loại node và số lượng node (giống thuê server), nên tối ưu chi phí đòi hỏi kinh nghiệm. AWS đã ra bản Redshift Serverless để giảm gánh nặng này.

Snowflake có kiến trúc rất được yêu thích: tách rời compute và storage. Dữ liệu lưu một nơi, còn "sức mạnh tính toán" (gọi là virtual warehouse) bạn bật lên khi cần và tắt đi khi xong, nhiều đội có thể chạy song song mà không giành tài nguyên của nhau. Snowflake không thuộc cloud nào — chạy được trên cả AWS, Azure, GCP — nên phù hợp công ty muốn tránh khóa cứng vào một nhà cung cấp.

Data warehouse, data lake và data lakehouse — đừng nhầm

Nhanh gọn để bạn không bối rối: data lake là nơi đổ dữ liệu thô đủ mọi định dạng (file JSON, ảnh, log) với chi phí lưu trữ rẻ, nhưng chưa tối ưu để query. Data warehouse là dữ liệu đã được làm sạch, có cấu trúc, tối ưu cho phân tích SQL. Lakehouse là xu hướng gộp hai thứ lại. Ở bài này ta tập trung vào data warehouse — trái tim của việc phân tích có cấu trúc.

Tình huống thực tế

Tình huống 1 — Sàn TMĐT tăng trưởng nóng và cái query giết chết website

Một startup thương mại điện tử ở TP.HCM (gọi là ShopViet) chạy toàn bộ trên một database PostgreSQL duy nhất. Ban đầu ổn: vài nghìn đơn/ngày. Nhưng khi lên 80.000 đơn/ngày và tích lũy 40 triệu dòng lịch sử, đội marketing bắt đầu chạy các báo cáo cohort (phân tích nhóm khách theo tháng đăng ký) trực tiếp trên database production.

Hậu quả: mỗi lần chạy báo cáo, thời gian phản hồi của website tăng vọt, có hôm khách không thanh toán được vào giờ cao điểm. Đội kỹ thuật quyết định tách phân tích ra: dùng công cụ ETL đổ dữ liệu từ PostgreSQL sang BigQuery mỗi giờ. Từ đó, marketing tự do chạy query nặng bao nhiêu tùy thích trên BigQuery mà website hoàn toàn không hề hấn gì. Báo cáo cohort trước đây chạy 8 phút giờ xong trong 4 giây.

Bài học: đừng bao giờ chạy phân tích nặng trên database production. Data warehouse tồn tại chính để "cách ly" tải phân tích khỏi tải giao dịch. Việc tách này không chỉ giúp nhanh hơn mà còn bảo vệ trải nghiệm khách hàng — thứ trực tiếp ra tiền.

Tình huống 2 — Ngân hàng số và bài toán chi phí theo lượng quét

Một fintech tại Việt Nam cung cấp ví điện tử, lưu log giao dịch vào BigQuery. Tháng đầu, hóa đơn BigQuery bất ngờ cao. Điều tra ra: một dashboard nội bộ được đặt tự động refresh mỗi 5 phút, và mỗi lần refresh nó chạy SELECT * FROM transactions trên bảng 2 TB. BigQuery tính tiền theo lượng dữ liệu quét, nên mỗi lần refresh quét trọn 2 TB — nhân với số lần refresh trong tháng thành một con số đáng giật mình.

Đội data sửa lại: chỉ SELECT đúng vài cột cần thiết, thêm partition theo ngày (chia bảng theo ngày giao dịch) và clustering theo mã người dùng. Sau đó, mỗi query chỉ quét đúng phân vùng của ngày cần xem — từ 2 TB xuống còn vài GB. Hóa đơn giảm hơn 90%, tốc độ dashboard cũng nhanh hơn hẳn.

Bài học: với data warehouse tính tiền theo lượng quét như BigQuery, kỹ thuật partitioning và clustering không phải chuyện "cho vui" — nó là đòn bẩy trực tiếp lên hóa đơn. Hiểu mô hình tính giá của công cụ bạn dùng cũng quan trọng như hiểu SQL.

Tình huống 3 — Tập đoàn đa quốc gia chọn Snowflake để chia sẻ dữ liệu

Một tập đoàn bán lẻ hoạt động ở Việt Nam, Thái Lan và Indonesia, mỗi thị trường dùng một cloud khác nhau vì lý do lịch sử (chỗ AWS, chỗ Azure). Ban lãnh đạo muốn một "nguồn sự thật" chung để so sánh hiệu quả kinh doanh giữa các nước. Họ chọn Snowflake vì nó chạy được trên nhiều cloud và có tính năng data sharing — cho phép chia sẻ dữ liệu giữa các tài khoản mà không cần copy đi copy lại.

Kết quả: đội phân tích ở trụ sở chính truy cập dữ liệu của cả ba thị trường qua một giao diện thống nhất. Khi thị trường Indonesia chạy chiến dịch khuyến mãi lớn, họ tự bật thêm virtual warehouse cỡ lớn để xử lý, không ảnh hưởng đội ở Việt Nam đang chạy báo cáo cuối tháng.

Bài học: khi tổ chức trải trên nhiều cloud hoặc cần chia sẻ dữ liệu giữa nhiều đơn vị, kiến trúc tách compute/storage và khả năng đa cloud của Snowflake là lợi thế thực sự, không chỉ là điểm cộng trên giấy.

Hướng dẫn từng bước

Dưới đây là quy trình thực tế để đưa data warehouse vào một dự án, minh họa bằng BigQuery cho dễ hình dung (nguyên tắc áp dụng chung cho cả Redshift và Snowflake):

  • Xác định câu hỏi kinh doanh trước, không chọn công cụ trước. Bạn cần trả lời báo cáo gì? Doanh thu theo vùng? Hành vi khách hàng? Câu hỏi quyết định cách bạn mô hình hóa dữ liệu.
  • Chọn công cụ theo hệ sinh thái sẵn có. Đang dùng nặng AWS thì Redshift là lựa chọn tự nhiên. Dùng Google (GA4, Google Ads) thì BigQuery. Đa cloud hoặc muốn linh hoạt thì Snowflake. Đừng chọn theo trào lưu.
  • Xây pipeline nạp dữ liệu (ingestion). Đưa dữ liệu từ nguồn (database giao dịch, file log, API) vào warehouse. Thường theo lịch (mỗi giờ, mỗi đêm) bằng công cụ ETL/ELT. Đây là bước tốn công nhất và dễ sai nhất.
  • Thiết kế schema và mô hình dữ liệu. Tổ chức bảng theo mô hình phù hợp phân tích (ví dụ star schema với bảng fact và bảng dimension). Đặt partition theo cột thời gian, clustering theo cột hay lọc.
  • Viết query và kiểm tra chi phí trước khi chạy. BigQuery cho biết một query sẽ quét bao nhiêu dữ liệu trước khi bấm chạy. Luôn nhìn con số đó, nhất là với bảng lớn.
  • Kết nối công cụ trực quan hóa. Nối warehouse với Looker Studio, Power BI, Tableau hoặc Metabase để biến số liệu thành dashboard cho người không biết SQL.
  • Giám sát chi phí và tối ưu định kỳ. Đặt cảnh báo ngân sách, xem lại các query đắt nhất hằng tuần, tối ưu partition/clustering. Data warehouse là khoản chi có thể phình to nếu thả nổi.

Lỗi thường gặp & mẹo

Lỗi: Dùng data warehouse như database giao dịch. Đừng cố INSERT/UPDATE từng dòng liên tục vào warehouse. Chúng tối ưu cho nạp theo lô (batch) lớn và đọc phân tích, chứ không cho ghi lắt nhắt tần suất cao. Muốn ghi giao dịch, hãy dùng OLTP.

Lỗi: SELECT * vô tội vạ. Với columnar storage, chọn thêm mỗi cột là quét thêm dữ liệu. Trên BigQuery điều này ra tiền thật. Luôn chỉ chọn đúng cột cần.

Lỗi: Quên partition và clustering. Bảng lớn không partition khiến mọi query phải quét toàn bộ. Partition theo ngày là mẹo đơn giản mà hiệu quả nhất, đặc biệt với dữ liệu log/giao dịch có yếu tố thời gian.

Lỗi: Nhầm data warehouse tính "theo dung lượng lưu trữ". Nhiều bạn nghĩ lưu nhiều mới tốn tiền. Thực tế với BigQuery, phần đắt thường là compute (lượng quét), không phải lưu trữ. Hiểu sai mô hình giá dẫn đến tối ưu nhầm chỗ.

Mẹo: Dùng bảng tổng hợp sẵn (materialized view / summary table). Nếu một báo cáo chạy đi chạy lại, hãy tính trước kết quả thành bảng nhỏ và cho dashboard đọc bảng đó, thay vì quét bảng gốc mỗi lần.

Mẹo: Bật auto-suspend cho compute. Với Snowflake, hãy để virtual warehouse tự tắt sau vài phút không dùng — bạn chỉ trả tiền khi thực sự tính toán.

Mẹo: Kiểm tra chi phí query trên môi trường nhỏ trước. Trước khi chạy một query nặng trên bảng vài TB, chạy thử với LIMIT hoặc trên một partition nhỏ để ước lượng.

Bài tập thực hành

  • Phân biệt tình huống: Cho 5 nhu cầu sau, hãy xác định cái nào nên dùng OLTP (database giao dịch) và cái nào nên dùng OLAP (data warehouse): (a) hiển thị giỏ hàng của một khách khi họ bấm vào; (b) báo cáo doanh thu theo tỉnh 12 tháng qua; (c) ghi nhận một lượt thanh toán mới; (d) tính tỷ lệ khách quay lại theo tháng đăng ký; (e) cập nhật số điện thoại của một tài khoản.
  • Thiết kế tối ưu: Bạn có một bảng giao_dich 3 TB, cột gồm ngay_giao_dich, ma_khach, so_tien, tinh_thanh và 30 cột khác. Một dashboard cần "tổng số tiền theo tỉnh, trong 7 ngày gần nhất". Hãy nêu: (a) nên partition theo cột nào; (b) nên clustering theo cột nào; (c) query nên chọn những cột nào để rẻ nhất.
  • So sánh công cụ: Với ba bối cảnh sau, đề xuất BigQuery, Redshift hay Snowflake và giải thích ngắn gọn: (a) startup 5 người, đã dùng Google Analytics 4, muốn phân tích nhanh không quản hạ tầng; (b) công ty đã đầu tư sâu vào AWS với dữ liệu trong S3; (c) tập đoàn chạy trên cả AWS và Azure, cần chia sẻ dữ liệu giữa các đơn vị.
  • Điều tra chi phí: Một dashboard chạy SELECT * FROM sales (bảng 5 TB) mỗi 10 phút. Hãy đề xuất tối thiểu ba thay đổi để giảm chi phí, và giải thích cơ chế mỗi thay đổi tiết kiệm ở đâu.

Tóm tắt

Data warehouse là công cụ chuyên trách cho phân tích (OLAP) trên khối dữ liệu lớn — khác hẳn database giao dịch (OLTP) vốn phục vụ các thao tác nhỏ và nhanh. Sức mạnh của nó đến từ hai kỹ thuật cốt lõi: columnar storage (lưu theo cột, chỉ đọc đúng cột cần, nén hiệu quả) và MPP (chia dữ liệu ra nhiều node xử lý song song).

Ba người chơi lớn: BigQuery serverless, tính tiền theo lượng quét, hợp đội nhỏ và hệ Google; Redshift gắn chặt AWS, mạnh khi bạn đã ở trong hệ sinh thái đó; Snowflake tách compute/storage, đa cloud, linh hoạt chia sẻ dữ liệu.

Nguyên tắc vàng khi làm việc với data warehouse: đừng chạy phân tích nặng trên production, luôn hiểu mô hình tính giá của công cụ, chọn đúng cột, và dùng partition/clustering để vừa nhanh vừa tiết kiệm. Khi báo cáo của bạn từ "chờ 8 phút và làm sập website" chuyển thành "xong trong 4 giây và không ai để ý", đó là lúc bạn đã dùng đúng công cụ cho đúng việc.

Học xong bài này rồi? Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu, và học hết khóa thì có chứng chỉ. Lưu tiến độ của tôi