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

วันนี้ผมมาเขียนบทความนอกสถานที่นิดนึงครับ พอดีวันนี้มาเที่ยวตลอดน้ำดอนหวายพร้อมด้วยกับอากาศที่ร้อนมากทำให้ใจผมร้อนอยากจะเขียนบทความขึ้นมาด้วย (เกี่ยวไหม) เอาละครับมาต่อกันจากคราวที่แล้วครับ ที่ติดเรื่องการแก้ปัญหาเรื่อง Fragment บนฐานข้อมูลไว้ครับ ซึ่งวิธีแก้นั่นไม่ได้ยากเลย เค้าเรียกว่าวิธีนี้ว่าการ Reorganize database เรียกสั้นๆ ว่า Reorg หรือแบบไทยๆ เราเรียกว่าการขอคืนพื้นที่นั่นเองครับ ฮ่าๆ เพื่อไม่ให้เสียเวลามาดูกันเลยครับ

Reorganize database

อ้างอิงจากท้ายบทความที่แล้วนะครับ ที่ผมได้ทดลองทำการลบข้อมูลออกไปครึ่งนึง แต่การคิวรี่ข้อมูลด้วย Full table scan นั้นได้ผลใกล้เคียงเดิมซึ่งเป็นผลมาจาก High water mark บนตาราง T นั้นเอง และผมจะแสดงวิธีในการแก้ปัญหานี้ออกเป็น 2 วิธีและแสดงตัวอย่างให้ดูทีละวิธีครับ

1. MOVE TABLE

ขั้นแรกผมขอเช็คจำนวน block เพื่อแสดงให้เห็นอีกรอบว่าไม่แตกต่างกับตารางในตอนแรกเลยนะครับ

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

ต่อมาผมจะเริ่มทำการ Reorganize table โดยการใช้วิธีแรกนั่นคือ Move table เพื่อสั่งให้ฐานข้อมูลนั้นจัดเรียงข้อมูลบนตารางนี้ให้เราใหม่ครับและสำหรับขั้นตอนนี้ ถ้าบนตารางนั้นๆ มีอินเด็กซ์อยู่เราจำเป็นต้องทำการ Rebuild index ใหม่ด้วยนะครับ เนื่องจากเมื่อตารางทำการจัดเรียงข้อมูลใหม่แล้วจะทำให้อินเด็กซ์เปลี่ยนสถานะเป็น invalid ไปด้วยและเพื่อทำการจัดเรียงข้อมูลให้ได้ตรงกับตารางนั้นๆ ด้วยครับ

  
SQL> ALTER TABLE T MOVE;

Table altered.

จากนั้นทำการ Gather stats ซัก 1 ครั้งเพื่อบอกฐานข้อมูลว่าตาราง T นั้นโครงสร้างได้เปลี่ยนแปลงไปแล้วครับ

SQL> BEGIN
  2     DBMS_STATS.GATHER_TABLE_STATS
  3     ( OWNNAME    => USER,
  4       TABNAME    => 'T' ,
  5       CASCADE    => TRUE );
  6  END;
  7  /

PL/SQL procedure successfully completed.

เรามาดูผลลัพธ์กันครับ

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

    BLOCKS
----------
      6772

SQL> SELECT * FROM T;

500000 rows selected.


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      39572  consistent gets
       6659  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

ซึ่งจากผลลัพธ์สามารถอธิบายเป็นภาพได้คร่าวๆ ดังภาพข้างล่างนี้ครับ

reorganize_f1

แล้วเดียวตอนหน้าจะมาโชว์วิธีที่ 2 ของการขอคืนพื้นที่บนฐานข้อมูลนะครับ อิอิ

ขอบคุณครับ
ขอบคุณข้อมูลเพิ่มเติมและภาพสวยๆ จาก
Todd Quackenbush
Altering Tables

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