Reorganize: สุดยอดเครื่องมือขอคืนพื้นที่ (2)

วันนี้เรามาต่อวิธีที่ 2 กับการทำ Reorganize database หรือการขอคืนพื้นที่บนฐานข้อมูลกันดีกว่าครับ นั่นคือการ Shrink table นั่นเองครับ อ้างอิงจากตาราง T ที่ผมทำการลบข้อมูลออกไป 500,000 บรรทัดนะครับ เมื่อเราทำการคิวรี่เพื่อทำการตรวจสอบจำนวนบล๊อกผลลัพธ์จะได้ดังนี้

SQL> SELECT BLOCKS FROM USER_TABLES WHERE TABLE_NAME = 'T';

    BLOCKS
----------
     13477

SQL> SET AUTOTRACE TRACEONLY STAT
SQL> SELECT * FROM T;
	
500000 rows selected.


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      46199  consistent gets
      13319  physical reads
          0  redo size
   28918511  bytes sent via SQL*Net to client
     367151  bytes received via SQL*Net from client
      33335  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
     500000  rows processed

ต่อมาผมจะเริ่มทำการ Shrink table โดยขั้นตอนแรกเราจำเป็นต้องทำการ Enable row movement เสียก่อนครับ เพื่อบอกให้ฐานข้อมูลรับรู้ว่าเรากำลังจะทำการเคลื่อนย้ายข้อมูลบนตารางนั้นๆ

SQL> ALTER TABLE T ENABLE ROW MOVEMENT;

Table altered.

ขั้นต่อมาเราจะทำการ Shrink space แบบ Compact ก่อนนะครับทำไมนะหรือ? นั่นก็เพราะว่าการใช้ Compact option เป็นเหมือนการแบ่งการ Reorganize ออกเป็น 2 ส่วน ดังนี้

1. Deflagment segment ขั้นตอนนี้จะเป็นการเคลื่อนย้ายข้อมูลบนตารางและนำไปจัดเรียงใหม่ ซึ่งวิธีการนี้จะไม่สร้างผลกระทบต่อ Online transaction เนื่องจากใน phase 2 นั่นคือการ Reset high watermark ซึ่งมันจะทำ exclusive lock กับตารางนั่นๆ และเหมาะกับการทำในช่วงเวลาปกติ
2. Reset high watermark เป็นขั้นที่ 2 ของการ Shrink table ครับ

เอาละครับเรามาเริ่มขั้นตอนแรกกันก่อนเลย

SQL> ALTER TABLE T SHRINK SPACE COMPACT;

Table altered.

เรามาดูผลหลังจาก Compact space กันครับ

SQL> SELECT * FROM T;

500000 rows selected.


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
      46219  consistent gets
      13319  physical reads
        124  redo size
   29182844  bytes sent via SQL*Net to client
     367151  bytes received via SQL*Net from client
      33335  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
     500000  rows processed

จะเห็นว่าผลลัพธ์ยังได้เท่าตอนแรกอยู่นั้นก็เพราะว่ามันยังไม่ได้ทำการ Reset highwater บนตาราง T ให้เราครับและสิ่งสุดท้ายที่เราต้องทำก็คือ…

  
SQL> ALTER TABLE T SHRINK SPACE;

Table altered.

และผลลัพธ์ก็เป็นอย่างข้างล่างนี้ครับ

  
SQL> SELECT * FROM T;

500000 rows selected.

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      39554  consistent gets
       6657  physical reads
          0  redo size
   29182844  bytes sent via SQL*Net to client
     367151  bytes received via SQL*Net from client
      33335  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
     500000  rows processed

อธิบายเป็นรูปง่ายๆ จะได้ดังรูปข้างล่างนี้ครับ

reorganize_f1

สรุปเกี่ยวกับการ Reorganize database

ในความเป็นจริงแล้ววิธีการ Reorganize database มีหลายวิธีด้วยกัน เช่น Create table as select (CTAS) หรือจะเป็นการ Redefinition table ซึ่งขึ้นอยู่กับพวกท่านจะเลือกใช้กันแล้วหละครับ

ขอบคุณครับ
ขอบคุณข้อมูลประกอบจาก
Oracle Help Center: Reclaiming Wasted Space

Advertisements

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s