Tuyển dụng
Viettel IDC

Full Table Scan trong Database là gì? Nguyên nhân, Cách phát hiện và Tối ưu

10/07/2026

Một truy vấn từng chạy mượt mà bỗng dưng ì ạch, đẩy CPU và I/O của database lên mức báo động? Thủ phạm giấu mặt thường là Full table scan – hiện tượng hệ thống phải quét cạn kiệt toàn bộ bảng thay vì tận dụng chỉ mục (Index). Bài viết này cùng Viettel IDC giải phẫu bản chất kỹ thuật của Full table scan, cách nhận diện qua Execution Plan và các phương pháp tối ưu hiệu năng triệt để. 

Full Table Scan là gì?

1. Bản chất kỹ thuật của Full Table Scan

Full Table Scan (Quét toàn bảng) là quá trình hệ quản trị cơ sở dữ liệu (DBMS) phải đọc tuần tự toàn bộ các dòng dữ liệu trong một bảng vật lý để tìm ra các bản ghi thỏa mãn điều kiện truy vấn, thay vì sử dụng cấu trúc chỉ mục (Index) để tìm đến đích nhanh chóng.

Về bản chất, đây là thao tác đọc dữ liệu ở mức độ thấp nhất và tốn kém nhất. Khác với việc có "đường tắt", hệ thống buộc phải nạp toàn bộ các trang dữ liệu (data pages/blocks) của bảng từ ổ cứng vào bộ nhớ chính (RAM) để đối chiếu điều kiện lọc, bất kể bạn chỉ cần tìm 1 dòng hay 1 triệu dòng.

2. Phân biệt Full Table Scan, Index Scan và Index Seek

Để tối ưu hóa, bạn cần hiểu rõ sự khác biệt giữa 3 cơ chế truy xuất dữ liệu cốt lõi này:

Cơ chế truy xuất

Cách thức hoạt động

Độ phức tạp thuật toán

Full Table Scan

Đọc tuần tự mọi trang dữ liệu của bảng gốc.

$O(n)$ — Tuyến tính (Tăng theo số dòng)

Index Scan

Quét tuần tự toàn bộ cấu trúc chỉ mục. Nhanh hơn Table Scan do Index có kích thước nhỏ hơn bảng gốc.

Thấp hơn Table Scan nhưng vẫn quét toàn bộ tập Index

Index Seek

Sử dụng cấu trúc cây (B-Tree) để duyệt và nhảy thẳng đến chính xác vị trí dữ liệu thỏa điều kiện.

$O(\log n)$ — Tối ưu nhất khi điều kiện lọc cụ thể

3. Full Table Scan có thực sự cần loại bỏ không?

Nhiều người mới làm việc với CSDL lầm tưởng quét toàn bảng luôn là dấu hiệu của một hệ thống tồi. Trên thực tế, Query Optimizer (Bộ tối ưu hóa truy vấn của DBMS) được lập trình rất thông minh và hoàn toàn có thể chủ động chọn Full Table Scan trong các kịch bản hợp lý:

- Bảng có kích thước cực nhỏ: Việc đọc một vài trang dữ liệu của bảng thẳng vào RAM tốn ít tài nguyên hơn nhiều so với việc phải duyệt qua cây chỉ mục rồi mới vòng lại đọc bảng gốc.

- Truy vấn cần trích xuất lượng dữ liệu lớn: Nếu kết quả trả về chiếm tỷ lệ lớn (ví dụ trên 20-30% số dòng của bảng), chi phí để tra cứu ngược (Key Lookup) từ Index về bảng gốc cho từng dòng sẽ đắt đỏ và tốn I/O hơn việc quét bảng một lần duy nhất.

- Tác vụ phân tích (OLAP/ETL): Các truy vấn xử lý theo lô (batch processing), làm báo cáo tổng hợp vốn dĩ yêu cầu phải đọc toàn bộ tập dữ liệu.

Vấn đề cốt lõi: Full Table Scan chỉ thực sự trở thành "thảm họa" khi nó xảy ra ngoài dự kiến trên các hệ thống giao dịch trực tuyến (OLTP), lặp lại với tần suất cao (hàng ngàn lần mỗi phút) trên các bảng dữ liệu khổng lồ. Đây chính là nguyên nhân trực tiếp vắt kiệt CPU và làm tê liệt hệ thống.

Cơ chế hoạt động của Query Optimizer khi quyết định Full Table Scan

1. Vai trò của Query Optimizer (Bộ tối ưu hóa truy vấn)

Khi một câu lệnh SQL được gửi đến hệ quản trị CSDL, nó không được thực thi ngay lập tức. Query Optimizer (hay Query Planner) sẽ tiếp nhận, phân tích và vạch ra nhiều phương án thực thi khả thi (Execution Plan Candidates). Nhiệm vụ của Optimizer là lựa chọn phương án có chi phí tài nguyên thấp nhất dựa trên mô hình CBO (Cost-Based Optimization - Tối ưu hóa dựa trên chi phí).

2. Cost-Based Optimization: Khi nào Optimizer "chọn" quét toàn bảng?

Hệ thống tính toán chi phí dựa trên nhiều yếu tố: số trang dữ liệu cần đọc, độ chọn lọc (Selectivity) của điều kiện lọc, và đặc biệt là bài toán so sánh giữa Sequential I/O (I/O tuần tự) và Random I/O (I/O ngẫu nhiên).

Trong ổ cứng máy chủ, việc đọc dữ liệu quét tuần tự liên tục thường nhanh hơn đáng kể so với việc ổ đĩa phải nhảy rải rác để đọc ngẫu nhiên. Do đó, nếu điều kiện WHERE có độ chọn lọc thấp (tức là trả về một tỷ lệ lớn số dòng trong bảng), Optimizer sẽ đánh giá việc dùng Index Seek (kéo theo vô số lượt tra cứu ngẫu nhiên để lấy dữ liệu gốc) đắt đỏ hơn việc dùng Sequential I/O để quét một mạch từ đầu đến cuối. Kết quả: Full Table Scan được lựa chọn.

3. Sự chi phối của Table Statistics (Thống kê dữ liệu)

Quyết định của Optimizer không phải là phép thuật, nó phụ thuộc hoàn toàn vào Table Statistics - bộ thông tin thống kê về phân bố dữ liệu (tổng số dòng, phân bổ giá trị theo từng cột, mức độ trùng lặp) mà hệ quản trị CSDL cập nhật định kỳ.

Nếu thống kê này bị lỗi thời (ví dụ: ngay sau một đợt import dữ liệu khổng lồ mà chưa chạy lệnh cập nhật), Optimizer sẽ trở nên "mù lòa". Hệ quả là nó có thể đưa ra quyết định sai lệch, chọn Full Table Scan dù thực tế Index Seek mới là phương án tối ưu, hoặc ngược lại.

Cơ chế hoạt động của Query Optimizer khi quyết định Full Table Scan

Top 6 nguyên nhân phổ biến nhất gây ra Full Table Scan

1. Thiếu Index hoặc Index không phù hợp

Đây là nguyên nhân kinh điển nhất. Các cột thường xuyên xuất hiện trong mệnh đề WHERE, JOIN hoặc ORDER BY nhưng lại không có index tương ứng. Khi không có "mục lục", cơ sở dữ liệu buộc phải quét tuần tự toàn bảng để tìm ra dữ liệu thỏa mãn điều kiện.

2. Không đảm bảo tính SARGable (Sử dụng hàm trên cột)

SARGable (Search-ARGument-ABLE) là khả năng DBMS sử dụng được chỉ mục cho câu lệnh. Việc áp dụng một hàm (function) trực tiếp lên cột đã được đánh index sẽ phá vỡ cấu trúc này.

- Ví dụ: Viết WHERE YEAR(created_at) = 2026 thay vì so sánh khoảng ngày tháng WHERE created_at >= '2026-01-01' AND created_at < '2027-01-01'. Lúc này, giá trị sau khi qua hàm không còn khớp trực tiếp với cây chỉ mục, ép hệ thống phải dùng Full Table Scan.

3. Toán tử LIKE với Wildcard ở đầu chuỗi (%keyword)

Cấu trúc cây B-Tree của Index được thiết kế tối ưu cho tìm kiếm theo tiền tố (prefix) từ trái sang phải. Nếu bạn viết câu lệnh dạng WHERE ten LIKE '%nguyen' (đặt ký tự % ở đầu), index thông thường sẽ vô tác dụng vì hệ thống không biết bắt đầu dò từ đâu trong cây chỉ mục, dẫn đến phải quét chuỗi con trên toàn bảng.

4. Bảng có kích thước quá nhỏ (Small Tables)

Như đã đề cập ở phần bản chất kỹ thuật, với những bảng có quá ít trang dữ liệu, Optimizer hoàn toàn có thể chủ động tính toán và thấy rằng Full Table Scan tốn ít chi phí (rẻ hơn) việc phải tra cứu qua index. Đây là hành vi vận hành bình thường và tối ưu của hệ thống, không phải lỗi cần khắc phục.

5. Lạm dụng SELECT * và thiếu điều kiện lọc

Sử dụng SELECT * thay vì chỉ định rõ các cột cần thiết, kết hợp với việc thiếu vắng mệnh đề WHERE chặt chẽ, khiến Optimizer không có căn cứ giới hạn phạm vi dữ liệu. Việc kéo toàn bộ cột cũng làm mất cơ hội sử dụng Covering Index (chỉ mục bao phủ), biến quét toàn bảng thành lựa chọn duy nhất.

6. Index bị "lão hóa" do thống kê chưa được cập nhật

Sau các chiến dịch Insert/Update/Delete khối lượng lớn, cấu trúc dữ liệu thay đổi nhưng nếu hệ thống không được bảo trì cập nhật thống kê (chạy lệnh ANALYZE trong PostgreSQL hoặc UPDATE STATISTICS trong SQL Server), Optimizer sẽ dựa trên bộ dữ liệu cũ rích để tính toán, từ đó đưa ra Execution Plan cực kỳ kém tối ưu.

Cách phát hiện Full Table Scan qua Execution Plan

Để chẩn đoán chính xác hệ thống có đang bị "vắt kiệt" bởi Full Table Scan hay không, các DBA không bao giờ đoán mò mà luôn dựa vào Execution Plan (Kế hoạch thực thi).

1. Sử dụng lệnh EXPLAIN / EXPLAIN ANALYZE (PostgreSQL, MySQL)

- Trong PostgreSQL: Bằng cách thêm tiền tố EXPLAIN ANALYZE trước câu truy vấn, hệ thống sẽ trả về kế hoạch thực thi thực tế. Nếu bạn thấy thao tác Seq Scan (Sequential Scan) xuất hiện ở cấp độ cao nhất của một bảng lớn, đó chính là Full Table Scan.

- Trong MySQL: Sử dụng lệnh EXPLAIN <query>. Hãy chú ý đến cột type. Nếu cột này trả về giá trị ALL, điều đó khẳng định MySQL đang phải quét toàn bộ các dòng của bảng để tìm kết quả.

2. Phân tích qua Actual Execution Plan trong SQL Server (SSMS)

Công cụ SQL Server Management Studio (SSMS) cung cấp giao diện đồ họa rất trực quan cho Execution Plan. Hai nút đồ họa (node) bạn cần đặc biệt cảnh giác là:

- Table Scan: Hệ thống đang quét toàn bộ một bảng Heap (bảng không có Clustered Index).

- Clustered Index Scan: Dù có chữ "Index", nhưng nếu đi kèm với một mệnh đề WHERE kém hiệu quả, thao tác này thực chất vẫn là quét toàn bộ các trang dữ liệu mức lá (leaf level) của bảng, tương đương với hệ quả của Full Table Scan.

3. Giải mã các chỉ số (Metrics) quan trọng

Khi đọc Execution Plan, đừng chỉ nhìn vào loại thao tác mà hãy phân tích sâu các chỉ số sau:

- Cost (Chi phí): Tỷ trọng chi phí tài nguyên (CPU, I/O) mà Optimizer tính toán cho bước quét bảng so với tổng thể truy vấn.

- Rows Examined vs. Rows Returned (Dòng quét thực tế vs. Dòng trả về): Đây là bằng chứng rõ ràng nhất của sự lãng phí. Nếu hệ thống phải đọc (Examined) tới 1.000.000 dòng chỉ để lọc và trả về (Returned) 5 dòng kết quả, bạn đang đối mặt với một vấn đề nghiêm trọng.

Cách phát hiện Full Table Scan qua Execution Plan

Cách tối ưu và khắc phục triệt để Full Table Scan

1. Thiết kế chiến lược Index (Chỉ mục) thông minh

- Single-column Index: Tạo chỉ mục cơ bản trên các cột thường xuyên đứng độc lập trong mệnh đề WHERE.

- Composite Index (Chỉ mục phức hợp): Rất quan trọng khi lọc nhiều cột cùng lúc (WHERE col1 = A AND col2 = B). Hãy nhớ quy tắc "Leftmost Prefix" – thứ tự các cột trong index phải khớp với thứ tự trong câu lệnh truy vấn.

- Covering Index (Chỉ mục bao phủ): Đỉnh cao của tối ưu hóa. Bằng cách thiết kế index chứa tất cả các cột mà truy vấn cần (SELECT), hệ thống sẽ thực hiện Index-Only Scan – lấy thẳng kết quả từ cây chỉ mục mà không cần chạm vào bảng gốc.

2. Viết lại câu lệnh SQL chuẩn SARGable

- Tuyệt đối không dùng hàm lên cột lọc: Viết lại các điều kiện chứa hàm để giữ nguyên vẹn giá trị cột. (Ví dụ: Đổi WHERE MONTH(order_date) = 1 thành WHERE order_date >= '2026-01-01' AND order_date < '2026-02-01').

- Khai tử thói quen SELECT *: Chỉ trích xuất đích danh các cột cần thiết để giảm thiểu I/O và tối đa hóa cơ hội sử dụng Covering Index.

- Tối ưu JOIN: Đảm bảo các khóa ngoại (Foreign Keys) hoặc các cột tham gia vào phép JOIN đều được đánh chỉ mục đầy đủ.

3. Bảo trì và cập nhật Table Statistics định kỳ

Đừng để Query Optimizer đưa ra quyết định dựa trên dữ liệu "mù". Hãy thiết lập các Job tự động chạy lệnh ANALYZE (PostgreSQL) hoặc UPDATE STATISTICS (SQL Server) vào ban đêm hoặc ngay sau các đợt ETL/thay đổi khối lượng lớn dữ liệu.

4. Phân vùng dữ liệu (Table Partitioning) cho bảng khổng lồ

Khi bảng đạt kích thước hàng trăm GB hoặc vài TB, index đơn thuần có thể không đủ. Việc áp dụng Partitioning (chia nhỏ bảng theo tháng, quý hoặc khu vực) sẽ kích hoạt cơ chế Partition Pruning. Thay vì quét toàn bộ bảng khổng lồ, hệ thống chỉ khoanh vùng và quét (thậm chí là quét tuần tự) trên một phân vùng dữ liệu rất nhỏ, giúp giải phóng lượng lớn tài nguyên.

5. Scale hạ tầng và tách biệt Workload (OLTP vs OLAP)

Sẽ có những tác vụ phân tích (Analytics/Báo cáo) bắt buộc phải quét toàn bảng. Trong trường hợp này, cố gắng tối ưu truy vấn là vô ích. Bài toán lúc này thuộc về kiến trúc hạ tầng:

- Tăng cường phần cứng: Nâng cấp IOPS ổ cứng (chuyển sang NVMe SSD) và tăng dung lượng RAM (Buffer Pool) để cache được nhiều dữ liệu "hot" hơn.

- Tách biệt kiến trúc: Thiết lập hệ thống Read Replica (Bản sao chỉ đọc). Đẩy toàn bộ các truy vấn quét dữ liệu lớn sang server Replica để xử lý, bảo vệ hệ thống giao dịch chính (Primary/Master) khỏi tình trạng tắc nghẽn.

Kết luận

Full Table Scan bản chất là một cơ chế bình thường của cơ sở dữ liệu. Tuy nhiên, nếu nó xảy ra mất kiểm soát trên các bảng dữ liệu khổng lồ với tần suất cao, hệ thống của bạn sẽ nhanh chóng bị vắt kiệt CPU và I/O. Bên cạnh việc tối ưu Index và tinh chỉnh SQL ở tầng ứng dụng, doanh nghiệp bắt buộc phải có một hạ tầng đủ thông minh để giám sát và ứng phó kịp thời.

Với Viettel Database Service cùng hệ sinh thái hạ tầng Data Center đạt chuẩn quốc tế, bảo mật cao và đội ngũ hỗ trợ kỹ thuật 24/7, Viettel IDC đồng hành cùng doanh nghiệp trong việc đảm bảo hệ thống cơ sở dữ liệu vận hành ổn định, kể cả khi khối lượng dữ liệu tăng trưởng vượt dự kiến ban đầu. 

Tìm hiểu giải pháp này ngay tại https://viettelidc.com.vn/viettel-database-service 

Để được hỗ trợ tư vấn và tìm hiểu các dịch vụ của Viettel, bạn có thể liên hệ trực tiếp tới Viettel IDC qua các kênh:

- Hotline: 1800 8088 (miễn phí cước gọi)

- Fanpage: https://www.facebook.com/viettelidc  

Bình luận ()

Đăng nhập | Đăng ký
để gửi bình luận
Ý kiến của bạn sẽ được xét duyệt trước khi đăng.
Ý kiến của bạn sẽ được xét duyệt trước khi đăng.
Ý kiến của bạn sẽ được xét duyệt trước khi đăng.
Xem thêm bình luận

Tin liên quan

20/10/2026

Viettel IDC dẫn đầu bảng xếp hạng Enterprise of Choice 2026 tại nhiều hạng mục quan trọng

Viettel IDC đạt 6 thứ hạng nổi bật tại Enterprise of Choice 2026, trong đó có 5 vị trí Top 1 ở các hạng mục về công nghệ thông tin, phát triển bền vững, doanh nghiệp được yêu thích bởi người lao động, lãnh đạo và thế hệ trẻ. Kết quả ghi nhận những nỗ lực của doanh nghiệp trong xây dựng môi trường làm việc tích cực, lấy con người làm trung tâm.

20/10/2026

So sánh các dịch vụ cloud backup phổ biến tại Việt Nam

So sánh các dịch vụ cloud backup phổ biến tại Việt Nam về phạm vi sao lưu, bảo mật, khôi phục, chi phí và mô hình triển khai để doanh nghiệp dễ lựa chọn.

20/10/2026

Dịch vụ lưu trữ đám mây nào tốt nhất cho doanh nghiệp nhỏ 2026? 9 lựa chọn nên tham khảo

So sánh 9 dịch vụ lưu trữ đám mây cho doanh nghiệp nhỏ năm 2026: công cụ chia sẻ file, Object Storage trong nước và quốc tế, kèm tiêu chí chọn nhà cung cấp.

20/10/2026

Mua chứng chỉ SSL cho website ở đâu uy tín? 5 kênh mua và triển khai

Có 5 kênh mua và triển khai chứng chỉ SSL cho website: CA, đại lý trong nước, nhà cung cấp hosting, nhà đăng ký tên miền và CA miễn phí. Xem ưu nhược điểm và cách kiểm tra nơi bán uy tín.

20/10/2026

Lưu trữ ngoài có an toàn không? Rủi ro và cách bảo vệ dữ liệu doanh nghiệp

Lưu trữ dữ liệu bên ngoài có an toàn không? Phân tích rủi ro, các lớp bảo vệ cần có và tiêu chí chọn nhà cung cấp cho doanh nghiệp.

19/10/2026

VDS là gì? VDS khác VPS và Dedicated Server như thế nào?

VDS là gì, khác VPS và Dedicated Server ở điểm nào, ưu nhược điểm và trường hợp nên sử dụng.

19/10/2026

Cách triển khai observability cho ứng dụng đám mây và microservices như thế nào

Hướng dẫn triển khai observability cho ứng dụng đám mây và microservices qua 7 bước, từ xác định SLI/SLO đến tối ưu chi phí telemetry.

19/10/2026

Top nhà cung cấp dịch vụ Dedicated Server giá tốt, tốc độ ổn định tại Việt Nam

Tổng hợp các nhà cung cấp Dedicated Server tại Việt Nam, so sánh mô hình dịch vụ, cấu hình, Data Center, uptime, băng thông và giá công bố.

19/10/2026

Top nhà cung cấp dịch vụ Hosting và VPS uy tín tại Việt Nam

Top nhà cung cấp Hosting và VPS uy tín tại Việt Nam. So sánh hạ tầng, uptime, loại dịch vụ và các tiêu chí cần kiểm tra trước khi lựa chọn.

19/10/2026

Thuê Cloud GPU có đắt không?

Thuê Cloud GPU có đắt không phụ thuộc vào yếu tố nào? Phân tích các mô hình tính phí, chi phí ẩn và cách tối ưu ngân sách khi dùng GPU đám mây.