Như ta đã biết, Oracle lưu trữ data trong các block. Với những table có thao tác DML nhiều, sau 1 thời gian dữ liệu trong các block có thể sẽ bị phân mảnh (fragmented). Nếu table đó có các index đi kèm thì các index đó cũng sẽ bị phân mảnh theo. Điều này gây lãng phí dung lượng lưu trữ, cũng như làm giảm hiệu suất hoạt động, chẳng hạn như khi muốn đọc dữ liệu trong table, Oracle có thể phải scan rất nhiều block rải rác.

 

Nếu sử dụng online table redefinition (dbms_redefinition), ta cũng có thể thu hồi dung lượng online. Tuy nhiên sử dụng Segment Shrink không đòi hỏi dung lượng tạm như khi dùng package kia, 2 nữa là thao tác đơn giản hơn. Ta vừa có thể thu hồi dung lượng, vừa chống phân mảnh cho các object trong database.

 

Để đánh giá segment nào cần shrink, ta có thể sử dụng Segment Advisor.

 

Cơ chế hoạt động của Segment Shrink cũng khá đơn giản, bao gồm 2 bước:

  • Bước 1: compact data rows
  • Bước 2: dời lại High water mark (HWM)

 

Hình minh họa cơ chế hoạt động của Segment Shrink

 

segment_shrink_1

[warningbox]Lưu ý: thao tác bước 2 – dời lại HWM có thể block hoạt động DML. Do đó bước 2 nên thực hiện vào thời gian user ít hoạt động [/warningbox]

 

Tuy nhiên, tính năng nào cũng có những hạn chế nhất định. Segment Shrink đòi hỏi segment phải nằm trên tablespace quản lý bằng ASSM (Automatic Segment Space Management), và segment không phải là các object sau:

  • Clustered tables
  • Table có cột kiểu LONG
  • Table có functionbased indexes
  • Table có on-commit hay ROWID-based materialized views
  • IOT mapping tables

Để thực hiện shrink, cần enable row movement trên table hay index. Lưu ý rằng thao tác này sẽ làm thay đổi ROWID, do đó cần cân nhắc nếu ứng dụng có sử dụng ROWID.

 

VD: ta shrink table HR.EMPLOYEES bằng các bước lần lượt như sau:

 

 

Trường hợp ta không quan tâm đến lock trên table, sau khi enable row movement, để thực hiện cả 2 bước compact data rows và dời lại HWM, ta chỉ cần thực hiện 1 lệnh duy nhất

 

 

Tính năng này có từ 11g giúp thao tác chống phân mảnh, thu hồi dung lượng đơn giản hơn nhiều so với phiên bản 10g, khi ta phải thực hiện nhiều thao tác khác nhau mới có thể hoàn thành công việc.