Thứ Tư, 25 tháng 2, 2026

MODULE 8: QUẢN TRỊ SPACE, TUNING KHÔNG GIAN, PARTITION VÀ INDEX

Khi làm việc với các hệ thống lõi có khối lượng giao dịch khổng lồ, việc cấp phát ổ đĩa (Module 7) mới chỉ là phần vỏ. Vấn đề thực sự nằm ở bên trong: Dữ liệu bị phân mảnh (Fragmentation), Bảng quá lớn gây chậm I/O (cần Partition), và Tối ưu hóa chỉ mục (Index Tuning).

Đặc biệt với những kiến trúc đặc thù như MVCC của PostgreSQL hay Clustered Index của SQL Server, cách chúng ta "dọn dẹp" rác và quy hoạch không gian sẽ quyết định trực tiếp đến sinh tử của hiệu năng.

Dưới đây là Module 8: Quản trị space, tuning không gian lưu trữ, partition, index.

1. Tổng quan

Theo thời gian, các lệnh UPDATEDELETE sẽ để lại những "lỗ hổng" (Dead Tuples / Ghost Records) bên trong các Block/Page dữ liệu. Nếu không dọn dẹp, hệ thống sẽ quét qua những khoảng trống này gây lãng phí I/O (Table Scan rất chậm).

Bên cạnh đó, việc cắt nhỏ dữ liệu (Partition) và tổ chức cây Index (B-Tree) là vũ khí tối thượng của DBA để duy trì tốc độ.

2. Chi tiết các nội dung

A. Quản lý phân mảnh và Thu hồi không gian (Space Reclamation)

Hệ thốngNguyên nhân gây "phình" (Bloat)Lệnh dọn dẹp & Thu hồi không gian (Reclaim Space)Lưu ý cho DBA
OracleHWM (High Water Mark) không tự lùi xuống sau khi Delete.ALTER TABLE ... SHRINK SPACE;Phải bật ENABLE ROW MOVEMENT trước khi Shrink.
SQL ServerIndex Fragmentation (Phân mảnh Page).ALTER INDEX REBUILD hoặc REORGANIZE.REBUILD khóa bảng (nếu không có Enterprise Edition), REORGANIZE làm online.
PostgreSQLKiến trúc MVCC (Update sinh ra dòng mới, dòng cũ thành Dead Tuple).VACUUM (dọn rác để dùng lại) hoặc VACUUM FULL (thu hồi lại đĩa).VACUUM FULL sẽ khóa cứng bảng (Exclusive Lock). Nên phụ thuộc vào Autovacuum.
MySQLDữ liệu bị xóa để lại khoảng trống trong file .ibd.OPTIMIZE TABLE table_name;Bản chất là hệ thống tự động tạo một bảng tạm mới và copy dữ liệu sang để sắp xếp lại.
MongoDBXóa document để lại khoảng trống trong file WiredTiger.Chạy lệnh compact trên collection.Gây block các operation khác trên database, nên chạy vào giờ thấp điểm.

B. Kiến trúc Index: Heap Table vs. Clustered Index

Đây là cú sốc lớn nhất khi chuyển từ Oracle sang SQL Server hoặc MySQL:

  • Oracle & PostgreSQL (Heap Table): Bảng là một đống lộn xộn (Heap). Index (B-Tree) lưu giá trị và con trỏ (RowID/CTID) trỏ đến dòng dữ liệu nằm ở đâu đó trong Heap.

  • SQL Server & MySQL InnoDB (Clustered Index): Bản thân cái Bảng chính là một cây Index. Dữ liệu thực tế được sắp xếp vật lý ở tầng lá (Leaf node) của Clustered Index. Nếu anh truy vấn theo khóa chính (Primary Key), I/O cực kỳ nhanh vì không cần bước "nhảy" từ Index vào Table như Heap.

C. Phân vùng dữ liệu (Partitioning)

  • Oracle: Vua của Partition (Range, List, Hash, Composite). Khai báo cực kỳ gọn gàng ngay lúc CREATE TABLE.

  • SQL Server: Rất rườm rà. Anh phải làm 3 bước: (1) Tạo Partition Function (Chia mốc thời gian) $\rightarrow$ (2) Tạo Partition Scheme (Map mốc thời gian vào Filegroup) $\rightarrow$ (3) Áp dụng Scheme vào Bảng.

  • PostgreSQL: Kể từ bản 10 có Declarative Partitioning. Bảng cha (Master Table) là rỗng, dữ liệu được tự động đẩy xuống các bảng con (Partitions).

  • MySQL: Cú pháp tương tự Oracle, khai báo ngay trong lệnh CREATE TABLE.

  • MongoDB: Gọi là Sharding. Phân tán dữ liệu ra nhiều server vật lý khác nhau dựa trên Shard Key.

D. Câu lệnh Quản trị & Kết quả đầu ra

1. SQL Server: Kiểm tra độ phân mảnh của Index

SQL
SELECT 
    dbschemas.[name] as 'Schema',
    dbtables.[name] as 'Table',
    dbindexes.[name] as 'Index',
    indexstats.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, 'LIMITED') AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
WHERE indexstats.avg_fragmentation_in_percent > 30; -- Lọc các Index phân mảnh nặng
-- Kết quả: dbo | Orders | PK_Orders | 45.5%

2. PostgreSQL: Kiểm tra số lượng Dead Tuples (Rác MVCC)

SQL
SELECT relname AS table_name, n_dead_tup, n_live_tup 
FROM pg_stat_user_tables 
WHERE n_dead_tup > 0;
-- Kết quả: orders_table | 50000 | 1000000 
-- (Có 50 ngàn dòng rác cần VACUUM).

3. Tóm tắt lại nội dung của bài học

  • Tư duy dọn rác ở các hệ thống là khác nhau: Oracle cần hạ High Water Mark, SQL Server cần chống phân mảnh (Defrag) Index, còn PostgreSQL "sống còn" nhờ vào tiến trình VACUUM để dọn Dead Tuples sinh ra do kiến trúc MVCC.

  • Việc thiết kế Khóa chính (Primary Key) trong SQL ServerMySQL quan trọng hơn Oracle rất nhiều, vì nó quyết định thứ tự lưu trữ vật lý của toàn bộ bảng (Clustered Index).

  • Tính năng Partition trên SQL Server phức tạp hơn nhưng bù lại, do tách bạch bằng Partition Scheme, việc Backup/Restore hoặc chuyển đổi vùng dữ liệu (Partition Switching) lại cực kỳ linh hoạt ở tầng Filegroup.


4. Câu hỏi ôn tập

  1. Hỏi (Oracle): Thuật ngữ nào chỉ mức giới hạn cao nhất mà các block dữ liệu đã từng được định dạng và ghi vào, làm cho các câu lệnh Full Table Scan luôn quét đến mức này dù dữ liệu đã bị xóa?

    • Đáp: High Water Mark (HWM).

  2. Hỏi (SQL Server): Với một Index có độ phân mảnh là 15%, anh nên dùng lệnh REBUILD hay REORGANIZE?

    • Đáp: Nên dùng REORGANIZE (tối ưu, ít tốn tài nguyên và chạy online). REBUILD thường chỉ dùng khi phân mảnh vượt quá 30%.

  3. Hỏi (PostgreSQL): Tại sao lệnh VACUUM FULL lại là "nỗi ác mộng" đối với các hệ thống đang hoạt động 24/7?

    • Đáp: Vì nó viết lại toàn bộ cấu trúc bảng sang một file vật lý mới để thu hồi tối đa ổ cứng, dẫn đến việc lấy khóa độc quyền (Access Exclusive Lock), chặn mọi thao tác SELECT/INSERT/UPDATE trên bảng đó.

  4. Hỏi (MySQL): Trong InnoDB, nếu anh không định nghĩa Primary Key thì hệ thống sẽ tổ chức bảng (Clustered Index) như thế nào?

    • Đáp: Nó sẽ tự tìm cột UNIQUE NOT NULL đầu tiên để làm Clustered Index. Nếu không có, nó tự sinh ra một cột ẩn (6-byte ROWID) để tổ chức dữ liệu.

  5. Hỏi (MongoDB): Để thực hiện chia nhỏ dữ liệu phân tán (Sharding), yếu tố tiên quyết mà DBA phải định nghĩa cực kỳ chuẩn xác là gì?

    • Đáp: Shard Key (Khóa phân mảnh - quyết định cách dữ liệu được phân phối đều hay bị dồn cục về một node).


5. Bài tập thực hành (Dọn dẹp & Tối ưu Bảng)

Đề bài: Bảng SALES_HISTORY vừa bị xóa (DELETE) một lượng lớn dữ liệu cũ. Hãy viết câu lệnh thực hiện dọn dẹp, tái cấu trúc để thu hồi lại không gian đĩa vật lý (Reclaim Storage Space) trên cả 5 hệ thống.

Đáp án:

1. Oracle: (Thu hồi qua Shrink Space)

SQL
ALTER TABLE sales_history ENABLE ROW MOVEMENT;
ALTER TABLE sales_history SHRINK SPACE;

2. SQL Server: (Rebuild lại Clustered Index - thường mang tên PK của bảng)

SQL
-- Dùng ONLINE = ON nếu đang dùng bản Enterprise để không block user
ALTER INDEX ALL ON sales_history REBUILD WITH (ONLINE = ON);

3. PostgreSQL: (Thu hồi ổ đĩa bằng Vacuum Full)

SQL
-- Lưu ý: Lệnh này block toàn bộ truy cập vào bảng
VACUUM FULL VERBOSE sales_history;

4. MySQL / MariaDB: (Tái cấu trúc file .ibd)

SQL
OPTIMIZE TABLE sales_history;

5. MongoDB: (Thu gọn không gian Collection)

JavaScript
// Phải switch vào database chứa bảng trước
use sales_db;
db.runCommand({ compact: 'sales_history' });

Hiểu sâu về cấu trúc lưu trữ và index ở mức block/page thế này sẽ giúp anh tự tin xử lý bất kỳ bài toán chậm hệ thống nào.

=============================
TƯ VẤN: Click Here hoặc Hotline/Zalo 090.29.12.888
=============================
Website không chứa bất kỳ quảng cáo nào, mọi đóng góp để duy trì phát triển cho website (donation) xin vui lòng gửi về STK 90.2142.8888 - Ngân hàng Vietcombank Thăng Long - TRAN VAN BINH
=============================
Nếu bạn không muốn bị AI thay thế và tiết kiệm 3-5 NĂM trên con đường trở thành DBA chuyên nghiệp hay làm chủ Database thì hãy đăng ký ngay KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE, được Coaching trực tiếp từ tôi với toàn bộ bí kíp thực chiến, thủ tục, quy trình của gần 20 năm kinh nghiệm (mà bạn sẽ KHÔNG THỂ tìm kiếm trên Internet/Google) từ đó giúp bạn dễ dàng quản trị mọi hệ thống Core tại Việt Nam và trên thế giới, đỗ OCP.
- CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
- Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
2 khóa học online qua video giúp bạn nhanh chóng có những kiến thức nền tảng về Linux, Oracle, học mọi nơi, chỉ cần có Internet/4G:
- Oracle cơ bản: https://bit.ly/admin_1200
- Linux: https://bit.ly/linux_1200
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
cơ sở dữ liệu, cơ sở dữ liệu quốc gia, database, AI, trí tuệ nhân tạo, artificial intelligence, machine learning, deep learning, LLM, ChatGPT, DeepSeek, Grok, oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c/21c/23c/23ai, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, docker, k8s, micro service, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master