Thứ Tư, 27 tháng 4, 2022

Cách để tim và bỏ những phân mảnh trên bảng Oracle Database

Giới thiệu

Trong bài viết này, tôi sẽ thảo luận về phân mảnh bảng, gây ra bảng chậm và lãng phí dung lượng. Phân mảnh là một vấn đề phổ biến xảy ra trong cơ sở dữ liệu oracle do các hoạt động DML quá mức như insert, sau đó là các hoạt động cập nhật và xóa.

Giải thích ngắn gọn:

Khi các dòng được insert vào bảng, high water mark -HWM (các block đã sử dụng) của bảng sẽ di chuyển về phía trước để chứa các dòng mới vào bảng. Nhưng trong quá trình xóa, oracle không cho phép high water mark lùi về phía sau để giảm kích thước bảng và giải phóng không gian trống.

Lý tưởng nhất là khi chúng ta xóa dữ liệu khỏi bảng, không gian trống sẽ được giải phóng hoặc sử dụng lại nhưng ngoài ra oracle còn có được các block mới để chứa các dòng mới để insert, gây ra lỗ hổng trong bảng.

Như bạn có thể thấy bên dưới, bảng chứa dữ liệu HWM từ  thấp tới cao chúng tôi gọi nó là block đã sử dụng và hai block cuối cùng là trống. Khi các dòng được chèn vào bảng, oracle sẽ di chuyển HWM lên cao để lấy các block trống để chứa các dòng mới thêm vào bảng đánh dấu các block trống như được sử dụng (Pic: 1A)

Nhưng sau khi thao tác xóa, oracle không dịch chuyển HWM về phía sau để giải phóng không gian trống như được hiển thị trong Pic: 1B.

Trong pic 1C, chúng ta có thể thấy rằng các block trống đã được giải phóng sau hoạt động xử lý phân mảnh.

Một số hình ảnh minh họa khác

Làm thế nào để loại bỏ phân mảnh trong oracle?

Có nhiều cách khác nhau để loại bỏ phân mảnh như export/import bảng, chuyển bảng trong tablespace hiện tại hoặc sang tablespace khác hoặc tạo lại bảng. Nhưng dưới đây chúng ta sẽ thảo luận cách dễ nhất và là cách thông dụng nhất để loại bỏ phân mảnh
Các bước để kiểm tra tình trạng phân mảnh:
Bước 1: Đầu tiên là cần Gather table statistics
Để tìm ra chính xác  total size và size thực tế của bảng từ dba_segments và dba_tables. Bạn có thể kiểm tra last analysed của table. Nếu bảng gần đây được analyze và không stale (cũ) thì có thể bỏ qua bước này: 

select table_name,last_analyzed,stale_stats from user_tab_statistics where table_name='&TABLE_NAME';
EXEC dbms_stats.gather_table_stats(ownname => 'TABLE_OWNER', tabname => 'TABLE_NAME', method_opt=> 'for all indexed columns size skewonly', granularity => 'ALL', degree => 8 ,cascade => true,estimate_percent => 15);
Bước 2: Kiểm tra table size từ dba_segments
select sum(bytes)/1024/1024/1024 from dba_segments where segment_name='&TABLE_NAME';
Bước 3: Kiểm tra  table size thực tế, fragmented size và % phân mảnh của bảng 
select table_name,avg_row_len,round(((blocks*16/1024)),2)||'MB' "TOTAL_SIZE",
round((num_rows*avg_row_len/1024/1024),2)||'Mb' "ACTUAL_SIZE",
round(((blocks*16/1024)-(num_rows*avg_row_len/1024/1024)),2) ||'MB' "FRAGMENTED_SPACE",
(round(((blocks*16/1024)-(num_rows*avg_row_len/1024/1024)),2)/round(((blocks*16/1024)),2))*100 "percentage"
from all_tables WHERE table_name='&TABLE_NAME';
Chú ý: Nếu > 20% phân mảnh thì bạn có thể tiến hành xử lý phân mảnh, dung lượng thu hồi được tính bằng dung lượng cấp phát từ dba_segments trừ đi size thực tế như câu lệnh bước 2, 3:
Bước 4: Kiểm tra indexes trên bảng 
select index_name from dba_indexes where table_name='&TABLE_NAME';
Bước 5: Loại bỏ phân mảnh bằng cách chuyển bảng (move) vào đúng tablespace hiện tại của nó hoặc Bạn có thể chuyển sang tablespace khác hoặc shrink
alter table <table_name> move;  

Để chuyển bảng sang tablespace khác: 

alter table <table_name> enable row movement;
alter table <table_name> move tablespace <new_tablespace>
Để shink 1 bảng (chú ý bảng to > 10GB phải cẩn thận vì sẽ rất lâu)

-- Cho phép row movement.
ALTER TABLE <table_name> ENABLE ROW MOVEMENT;
-- Khôi phục không gian lưu trữ và sửa đổi high water mark (HWM). ALTER TABLE <table_name> SHRINK SPACE;
-- Khôi phục
không gian lưu trữ nhưng không sửa đổi the high water mark (HWM).
ALTER TABLE <table_name> SHRINK SPACE COMPACT;
-- Recover
không gian lưu trữ cho đối tượng và mọi đối tượng phụ thuộc
ALTER TABLE <table_name> SHRINK SPACE CASCADE;
Bước 6: Rebuild lại index
alter index index_name rebuild online;
Bước 7: Gather statistics:
EXEC dbms_stats.gather_table_stats(ownname => 'TABLE_OWNER', tabname => 'TABLE_NAME', method_opt=> 'for all indexed columns size skewonly', granularity => 'ALL', degree => 8 ,cascade => true,estimate_percent => 15);
Bước 8: Bước cuối cùng kiểm tra size bảng và % phân mảnh: 
select sum(bytes)/1024/1024/1024 from dba_segments where segment_name='&TABLE_NAME';

select table_name,avg_row_len,round(((blocks*16/1024)),2)||'MB' "TOTAL_SIZE",
round((num_rows*avg_row_len/1024/1024),2)||'Mb' "ACTUAL_SIZE",
round(((blocks*16/1024)-(num_rows*avg_row_len/1024/1024)),2) ||'MB' "FRAGMENTED_SPACE",
(round(((blocks*16/1024)-(num_rows*avg_row_len/1024/1024)),2)/round(((blocks*16/1024)),2))*100 "percentage"
from all_tables WHERE table_name='&TABLE_NAME';

Chú ý: Thủ tục trên áp dụng cho bảng non-partition. Với bảng partition bạn có thể move từng partition là cách dễ nhất để thu hồi dung lượng.
=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* 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
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile: 0902912888
⚡️ Skype: tranbinh48ca
👨 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: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Đị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

=============================
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,khóa học pl/sql, 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, 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 dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

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