Sunday, May 27, 2012

Rebuild Index: งามอย่างอ้วน

พิมพ์ อีเมล
I
ndex ไม่ควรจะถูก Rebuild ยกเว้นแต่ในบางกรณีเท่านั้น การทำ Rebuild Index ส่วนใหญ่จะเป็นการสูญเสียเวลาเปล่า ๆ บางคนใช้วิธีการดูว่ามีการลบค่าต่าง ๆ ออกจาก Index มากแค่ไหน และทำการ Rebuild Index ซึ่งอาจจะเป็นการเข้าใจผิด คำถามคือถ้า 50% ของค่าใน Index ถูกลบไป ซึ่งทำให้เกิด "รู" ใน Index เราควรจะ Rebuild หรือเปล่า คำตอบคืออาจจะหรืออาจจะไม่ ขึ้นอยู่กับว่า Index นั้นถูกใช้อย่างไร และข้อมูลแบบใดที่ถูก Index ลองดูตัวอย่างข้างล่างนี้:
create table emp ( empno int, ename varchar2(25) );
create index emp_idx1 on emp(empno);
create index emp_idx2 on emp(ename);

คราวนี้ถ้าคอลัมน์ empno ถูกเติมด้วย Sequence (1,2,3,...) มันจะเพิ่มขึ้นเรื่อย ๆ และเราจะไม่เคยใช้ค่าที่ซ้ำกับค่าที่มีอยู่เดิมใน Index เลย เนื่องจาก Sequence จะไม่สร้างเลขที่เคยสร้างไปแล้ว ถ้าสมมติว่า HR ไล่คนออกบางคน emp_idx1 จะเป็น "รู" ซึ่งเป็น "รู"ที่จะไม่เคยถูกใช้อีกเลย และเมื่อเวลาผ่านไปเราพบว่า Index ตัวนี้มี "รู" เพิ่มขึ้นเมื่อมีการลบข้อมูลที่ถูก Index ไว้ กรณีแบบนี้อาจจะเหมาะกับการทำ Rebuild เนื่องจากพื้นที่ที่เป็น “รู” จะได้สามารถนำกลับมาใช้ใหม่ได้ และทำให้ Index มีความ “กระชับ” ขึ้น
แต่ถ้าเป็นกรณีของ Index บน ename สมมติว่าเรามีพนักงานชื่อ:
Bill
Bob
Mary

ถ้าเราไล่ Bob ออก (ลบ Bob ออกจากตาราง) เราจะได้ค่าใน Index เป็น
Bill
X-Bob (ค่าที่ถูกลบ)
Mary

เราควรที่จะ Rebuild Index แบบนี้หรือเปล่า? อาจจะไม่ เหตุผลก็คือเราอาจจะจ้าง Hillary ซึ่งเมื่อเราเพิ่ม Hillary เข้าไป:
Bill
Hillary
Mary

ซึ่ง Hillary สามารถใช้ Slot ของ Bob ได้ จึงไม่มีเหตุผลที่เราจะกำจัดพื้นที่ (Slot) นั้น ถ้าข้อมูลที่เรากำลังทำ Index มีความน่าจะเป็นที่จะไปใช้พื้นที่เดิมนั้น ๆ ในภายหลัง
หลังการ Rebuild อาจจะทำให้ระบบของคุณช้าลง โดยเฉพาะกับระบบ OLTP ทั้งนี้เนื่องจากระบบยังคงต้องมีการเพิ่มหรือขยายโครงสร้างของ Index ซึ่งเหล่านี้ต้องใช้เวลาและทรัพยากรของระบบไม่น้อยในการขยายตัวกลับไปสู่ โครงสร้างเดิม (ที่เสถียรอยู่แล้ว) เมื่อเวลาผ่านไป Index ส่วนใหญ่จะเข้าสู่ Steady State ถ้าเรา Rebuild มัน Index จะกลับเข้าสู่สภาวะที่แม้จะกระชับ แต่ก็ไม่ได้สะท้อนโครงสร้างที่แท้จริง และในที่สุดมันก็จะขยายตัวกลับไปสู่โครงสร้างเดิมที่มีขนาดและลักษณะที่ เหมาะสมกับงานที่มันรองรับ แต่ปัญหาก็คือการขยายตัวกลับไปนั้นจะต้องแลกกับการใช้ทรัพยากรของระบบอย่าง มาก
ดังนั้นก่อน Rebuild ควรเก็บข้อมูลสถิติ, ประสิทธิภาพ, IO ฯลฯ ของ Index ตัวนั้น และเปรียบเทียบค่าเหล่านี้หลังทำ Index Rebuild ถ้าไม่ได้อะไรจากการทำ Index Rebuild ก็ไม่ควรทำ
ข้างล่างนี้เป็นผลจากการ Rebuild Index จากเหตุการณ์จริง

 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> HELP!!!! Riddle me this batman...

Why does an rebuilding an index cause increased redolog generation AFTER the index has
been built?

I have a table 35 million rows and an index (nothing is partitioned) Transactions against
this table are constant. It's always 500,000 rows per day. This generally creates 10
logs a day

Once a month the indexes are rebuit. (Alter index rebuild)
On the day following the indexes rebuild 50 logs are created
On the following days 45...40...35...30....25....down to 10 at 10 logs this remains
constant at 10 Mining the logs we see that we have increase INTERNAL INDEX UPDATES

Why does this happen?? Is this always the case??
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 
จากตัวอย่างการ Rebuild Index ข้างต้นจะเห็นได้ว่า ระบบจะต้องสร้าง Redo เพิ่มขึ้นมากกว่าเดิมถึง 4.5 เท่า ซึ่งส่งผลกับประสิทธิภาพของระบบโดยรวม

Index มีลักษณะคล้าย ๆ มนุษย์ คือมีน้ำหนักที่เหมาะสมกับตัวมันเองตามธรรมชาติ เราบางคนอาจจะผอม บางคนอ้วน บางคนสูง บางคนเตี้ย แม้ว่าเราจะสามารถที่จะพยายามจะเข้าคอร์สลดน้ำหนัก แต่แล้วในที่สุดเราก็มักจะมีแนวโน้มที่จะกลับไปเป็นอย่างที่เราเคยเป็น ซึ่งก็เช่นเดียวกับ Index จะเป็นอย่างไรถ้า Index ตัวหนึ่งที่อ้วน พยายามที่จะผอม (เข้าคอร์สลดน้ำหนัก) ทุก ๆ เดือนเพื่อที่จะอ้วนอีกทีตอนกลางเดือน ในขณะที่ต้องแลกกับการสร้าง Redo อีกจำนวนมากเพียงเพื่อจะกลับมาอ้วนเหมือนเดิม และเมื่อกลับไปที่ขนาดของ Index อ้วนตามที่มันต้องการแล้ว และเมื่อถึงตอนนั้น เราก็จะ Rebuild เพื่อที่จะให้ Index ผอมอีกทีหนึ่ง เพื่อที่จะทรมานให้ระบบจะต้องใช้พลังในการขยายตัวให้ได้ขนาดที่ต้องการอีก เป็นอย่างนี้ไม่รู้จบ

ดังนั้นเราควรยกเลิกการ Rebuild Index ตาม Schedule เราจะ Rebuild Index ก็ต่อเมื่อเราสามารถจะระบุได้ว่าปัญหาเรื่อง Performance ที่พบมาจาก Index จริง ๆ และการ Rebuild จะแก้ปัญหานั้นได้

หมายเหตุ: อาจจะบางกรณีที่การ Rebuild มีประโยชน์อย่างเช่นการ Rebuild Bitmap Index หลังจากการโหลดข้อมูลขนาดใหญ่ แต่ใน OLTP ส่วนใหญ่ความจำเป็นในการ Rebuild Index มีน้อยมาก

เรียบเรียงจาก:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2290062993260
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6601312252730

No comments:

Post a Comment