Posted by: siamnobita | 03/26/2009

Oracle Related Myths

ผมเลือกหัวข้อนี้ เป็นหัวข้อแรกในการเปิดตัว blog โดยลอกความคิดมาจากคุณ Richard Foote ซึ่งเป็น guru ท่านหนึ่งใน oracle และเป็นแรงบันดาลใจให้ผมเขียน blog ของตัวเอง

myth แปลว่า เรื่องโกหกหรือนิทานปรัมปรา

ตั้งแต่ ผมเข้ามาทำงานในสายงานที่เกี่ยวข้องกับ oracle นับครั้งไม่ถ้วนจริง ๆ กับประโยคที่ขึ้นต้นด้วย “เห็นเขาว่ากันว่า …” หรือ “ใคร ๆ เขาก็รู้ทั้งนั้นว่า …” หรือ “ก็เห็นรุ่นพี่ที่ทำงานเก่าเขาทำอย่างนี้นี่”  เป็นความประพฤติที่ดีที่คนไทยอย่างเราจะนับถือผู้หลักผู้ใหญ่ ให้ความเคารพและเชื่อถือคำกล่าวของผู้อาวุโส แต่ทั้งนี้ทั้งนั้น ต้องมีพื้นฐานอยู่บนหลักของเหตุและผล บางคนก็เชื่อไว้ก่อนเพราะไม่อยากเสี่ยง เข้าทำนอง “เดินตามผู้ใหญ่ หมาไม่กัด” เพราะกัดผู้ใหญ่แทน ทำนองนั้น

หลาย ๆ ครั้ง ประสบการณ์ก็ไม่อาจช่วยเราได้เสมอไป สมัยที่ผมเพิ่งเรียนจบ เข้าทำงานเป็นวิศวกรโรงงานใหม่ ๆ ลูกน้องแต่ละคนถือได้ว่าเชี่ยวชาญในเรื่องการแก้ปัญหาข้อขัดข้องของเครื่องจักร อย่างที่ผมเทียบไม่ติด อย่างไรก็ดี ส่วนใหญ่เขาจะรู้แค่ how ดังนั้น เมื่อเกิดปัญหาที่แตกต่างจากปัญหาเดิม ๆ ข้อผิดพลาดก็จะเกิดขึ้น เป็นหน้าที่ของเหล่าวิศวกร นั่งวิเคราะห์หาสาเหตุ นั่นคือเราต้องรู้ why ด้วย และนั่นจะทำให้เราแก้ปัญหาที่เราไม่เคยเจอมาก่อนได้

oracle เป็นฐานข้อมูลที่มีลูกค้ามากมายอันดับต้น ๆ ของโลก และมีประวัติศาสตร์อันยาวนาน จึงเกิดผู้เชี่ยวชาญขึ้นจำนวนมาก แต่สิ่งหนึ่งที่เราพึงระลึกเสมอขณะที่เรากำลังเรียนรู้จากผู้เชี่ยวชาญเหล่านี้ คือ ไม่มีใครรู้ทุกเรื่องที่เกี่ยวกับ oracle และข้อเท็จจริงบางอย่างเกิดขึ้นในอดีต แต่ไม่จำเป็นจะต้องเกิดขึ้นอีกในอนาคต

“เราต้อง rebuild index อย่างสม่ำเสมอ เพื่อเพิ่มประสิทธิภาพในการทำงาน”
“อย่าลืมสั่ง commit บ่อย ๆ นะ ไม่งั้นมันจะกิน resource”
“คุณต้องแยก index กับ table อยู่คนละ tablespace กัน ไม่งั้นมันจะช้า”
“ใช้ feature นั้น ระวังเดี๋ยวก็เจอ bug หรอก”

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

มีขำขันอยู่เรื่องหนึ่ง เกี่ยวกับนักวิทยาศาสตร์ซึ่งทำการทดลองเกี่ยวกับแมลง เขาพบว่า เมื่อเขาปล่อยแมลงสาบออกจากกล่อง แล้วดีดนิ้ว แมลงสาบทุกตัวจะวิ่งหนีไป อย่างไรก็ดี เมื่อเขาทำการทดลองซ้ำกับแมลงสาบที่เขาเด็ดขาออกทั้งหมด เขาพบว่าไม่ว่าจะดีดนิ้วกี่ครั้ง ส่งเสียงดังขนาดไหน แมลงสาบก็ยังนิ่งอยู่กับที่ เขาจึงสรุปว่า แมลงสาบฟังเสียงด้วยขา เพราะเมื่อเด็ดขาออก มันจะหูหนวก ไม่ได้ยินเสียงอะไร

เรามองว่าเรื่องข้างบนนี้เป็นเรื่องขำขัน เพราะเรารู้ว่าจริง ๆ แล้วมันเกิดอะไรขึ้น แมลงสาบมันถึงไม่วิ่งหนี แต่ครั้งหนึ่งเมื่อเรา rebuild index แล้วปรากฏว่า response time ของ query ของเราเร็วขึ้น เราก็สรุปเลยว่าการ rebuild index ช่วยเพิ่มประสิทธิภาพในการทำงาน ทั้ง ๆ ที่มีสาเหตุที่เป็นไปได้อีกมากมายที่ทำให้ query นั้นเร็วขึ้น เราสรุปโดยไม่ได้วิเคราะห์ว่าปรากฏการณ์นั้น ๆ เกิดขึ้นได้อย่างไร เราไม่ได้ต่างไปจากนักวิทยาศาสตร์ท่านนั้นเลย ยังขำอยู่ไหมครับ นี่คือที่มาของนิทานปรัมปราใน oracle

เราคนไทยที่นับถือพุทธศาสนา คงรู้จักกาลามสูตรกันดีอยู่แล้ว ผมคงไม่ทบทวนให้ฟัง เพราะผมก็จำไม่ได้เหมือนกัน แต่ที่ผมเขียนเรื่องนี้เป็นบทความแรก ก็เพื่อจะเตือนคุณว่า อย่าเชื่อในสิ่งที่คุณอ่านจาก blog นี้ โดยที่คุณยังไม่ทำความเข้าใจ เพราะผมอาจเป็นคนหนึ่งที่กำลังเล่าเรื่องโกหกด้วยความบริสุทธ์ใจอยู่ก็ได้ พิสูจน์ด้วยตัวคุณเองทุกครั้ง กรุณาอย่าใช้คำว่า “ก็คุณ siamnobita เคยบอกว่า…” เด็ดขาด ผมเตือนคุณแล้วนะ

ด้วยรักและปรารถนาดี


Responses

  1. เชื่อพี่ต้อม ก้อทำข้อสอบเกือบเต็ม น่ะ 5555 เพราะงั้นเชื่อก่อน ดีกว่า อันไหนทะแม่งๆค่อยว่ากันอีกที ว่าเป็นเพราะอะไร

  2. ขอบคุณครับ

    แต่ผมว่า ถ้า rebuild index แล้ว overall performance ดีขึ้น จะให้สรุปยังไงหละครับ

    Overall performance นี่หมายถึงรวมๆเลยนะครับไม่ใช่คิวรี่ใดคิวรี่หนึ่ง หรือ คิวรี่ที่ผลถูก cache แล้ว

    ปกติเราก็มักจะสังเกต change ก่อนว่า มีchangeอะไรม่าง ในกรณีนี้ ถ้า noticable change คือ rebuild index ก็แน่นอนหละครับ ต้องสรุปอย่างนี้ก่อนเป็นอันดับแรก

    แต่ความเป็นจริง เรื่อง rebuild index อาจมอนิเตอร์เดี่ยวๆ ในระบบใหญ่ๆยาก เพราะว่า สว่นใหญ่ rebuild index มักทำควบคุ่กับการ alter table move เพื่อหลีกเลี่ยง ปัญหา unusable

    ยังไง ก็ขออนุญาติคิดต่างนะครับ
    ขอบคุณที่แบ่งปันไอเดียนะครับพี่
    ผมว่าผมเคยเจอพี่นะครับ หุหุ

    • เห็นด้วยครับที่ว่าการ rebuild index หรือ ไม่ว่าจะเป็นเรื่องอื่นๆเช่น parallel มันจะส่งผลกับ overall performance หรือไม่

      เพราะ ผลลัพธ์มันมีได้3ข้อคือ
      1.ส่งผล
      2.ไม่ส่งผล
      3.ไม่เกิดอะไรขึ้น

      รบกวนขอ presentation ของคุณ richard foote ด้วยจะได้ไหมครับ ขอบคุณครับ

  3. ดีใจมากมาย ที่ในที่สุดก็มีผู้อ่านตัวจริง comment มาเสียที
    ขอบคุณมากครับ

    ขอขยายความเพิ่มเติมสำหรับความเห็นของผมเกี่ยวกับเรื่อง oracle myths นี้ก่อน

    1. ผมไม่ได้บอกว่าการ rebuild index ไม่มีประโยชน์โดยสิ้นเชิงนะครับ ตามกฏของวิวัฒนาการแล้ว อะไรที่ไม่มีประโยชน์จะสูญพันธ์ไปในที่สุด ดังนั้นในเมื่อมันยังคงอยู่จนถึงวันนี้ มันย่อมมีประโยชน์ที่แท้จริงไม่มากก็น้อยอย่างแน่นอน
    2. ปัญหาของการสรุปว่า “rebuild index ทำให้ performance ดีขึ้น” คือ ความจริงที่ว่าบางสถานการณ์มันจะทำให้ดีขึ้น แต่บางสถานการณ์มันจะทำให้ performance โดยรวมแย่ลง ซึ่งหากเรายึดข้อสรุปนี้เป็นแนวทางในการแก้ปัญหาครั้งต่อไปโดยไม่พิจารณาปัจจัยอื่น ๆ สุดท้ายเราก็จะแก้ปัญหาไม่ได้ และอาจทำให้มันยิ่งยุ่งนักเข้าไปอีกด้วยซ้ำ (เพราะเรามักจะสร้าง job ทำงานอัตโนมัติเพื่อ rebuild ไปเลย จริงไหมครับ)
    3. วิธีที่ควรทำคือพิจารณาลึกลงไปอีกชั้นหรือหลาย ๆ ชั้นว่า ทำไม rebuild index แล้ว เราถึงสังเกตเห็นการพัฒนาที่ดีขึ้นในแง่ของ performance อะไรคือความเปลี่ยนแปลงที่เกิดขึ้นจริง index ก่อนและหลัง rebuild มีอะไรที่แตกต่างกัน จากนั้นจึงสามารถสรุปได้ว่า เมื่อไรที่ rebuild index เกิดประโยชน์ เมื่อไรเกิดโทษ และเมื่อไรที่ไม่มีผลอะไรทั้งสิ้น
    4. อย่างที่คุณ Apisit เองบอกว่าเรามักจะทำการ rebuild index ไปพร้อมกับทำสิ่งอื่น ๆ อีกหลายอย่าง ทำให้ยากที่จะสรุปได้ ใช่เลยครับ นั่นคือปัญหาที่แท้จริงเลย หลักของการ tuning ที่ถูกต้อง เราต้องทำทีละอย่างครับ ไม่เช่นนั้นเราก็ไม่มีทางรู้ว่าปัญหาอยู่ที่ไหน แล้วเราแก้ปัญหาไปได้อย่างไร
    5. ผมยกตัวอย่างง่าย ๆ หลัง rebuild index เราก็ต้องมีการเก็บ index statistics ใหม่ถูกต้องไหมครับ ถามว่าเราทดสอบ query ทันทีที่ rebuild หรือ หลังทำทุกขั้นตอนแล้ว แล้วเป็นไปได้หรือไม่ว่า ตัวที่ทำให้ performance ดีขึ้นจริง ๆ ไม่ใช่คำสั่ง rebuild แต่เป็น analyze ที่เรามองข้าม

    ความตั้งใจของผมสำหรับ blog หน้านี้ ต้องการพูดถึงเรื่อง oracle myth ทั่วๆ ไป ไม่ได้จำเพาะเจาะจงในเรื่องของการ rebuild index แต่เนื่องจากคุณ apisit ได้แสดงความเห็นในจุดนี้ ผมขออนุญาติ ส่ง presentation ของคุณ Richard Foote เกี่ยวกับเรื่อง rebuild index นี้ให้กับคุณ Apisit ทางเมล์นะครับ ผมเองไม่ใช่ผู้ชำนาญทางด้าน DBA ดังนั้นขออ้างอิงความเห็นของผู้เชี่ยวชาญจริง ๆ หน่อยก็แล้วกัน ทนอ่านให้จบนะครับ มันยาวมาก


ใส่ความเห็น

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

หมวดหมู่

%d bloggers like this: