Selectivity จงมา!!! การจัดลำดับ Column บน Index


ห่างหายไปนานเลยนะครับ พอดีช่วงนี้งานเยอะมากเลยไม่มีเวลามาแบ่งปันข้อมูลสาระดีๆ กันเลย ก็วันนี้ผมจะนำเสนอเกี่ยวกับความสำคัญในการจัดลำดับก่อนหลังในการสร้าง index เพื่อให้ไปประสิทธิภาพที่ดีที่สุดมาฝากกันครับ

จากบทความเก่าที่ผมเคยเขียนเกี่ยวกับค่า Selectivity บน Column หรือค่าเฉพาะ (Distinct value) นั้นสำคัญมากสำหรับการสร้าง Index ที่ดี ยิ่งมีค่าเฉพาะมากหรือเท่ากับจำนวนบรรทัด นั่นเท่ากับค่า Selectivity ที่เท่ากับ 100% และเราจะได้รับประสิทธิภาพเต็มที่จาก Index ตัวนั้นๆ

Continue Reading

โฆษณา

Optimizer_mode ค่าไหน? ควรใช้เมื่อใด?


บนฐานข้อมูล Oracle นั้น มีพารามิเตอร์บางตัวที่เป็นดั่งกระสุนเงิน ที่สามารถสร้าง Impact กับประสิทธิภาพบนฐานข้อมูลได้ในระดับกว้าง หนึ่งในกระสุนเงินเพื่อกำราบพวกคิวรี่ผีดิบคือ Optimizer_mode ครับ

ผลกระทบของ Optimizer_mode ที่ทำให้ Execution plan เปลี่ยน!

Continue Reading

Optimizer Hints อาวุธหนักในการ Tuning SQL


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

Continue Reading

Function-based index กับการใช้งานคอลัมน์ DATE


สำหรับวันนี้ผมจะมาทำจำลองเหตุการณ์ว่าทำไม? เมื่อเราใช้ TRUNC ฟังก์ชั่นบน DATE คอลัมน์ในคิวรี่แล้ว ทำไมคิวรี่ของเราจึงช้าลง ในขณะทีเราก็สร้างอินเด็กซ์บน DATE ไปให้แล้ว และในช่วงท้ายผมจะพูดถึงพระเอกของงานนี้นั้นคือ function-based index นั่นเองครับ เอาละครับมาเริ่มกันเลย
หนึ่งในสาเหตุสำหรับปัญหาเกี่ยวกับ SQL Statement ที่ได้พบได้เจอกันบ่อยๆ นั่นก็คือ Full table scan ซึ่งถูกกำหนดให้เป็น invalidating บน Index ใน SQL Statement ที่ WHERE clause ถูกเรียกใช้งาน Built-in function บน DATE column มาดูตัวอย่างกันครับ

Continue Reading

Index Selectivity นั้นสำคัญไฉน?


Index selectivity คืออะไร?

Balance tree index ช่วยทำให้ประสิทธิภาพของคิวรี่ที่เรียกข้อมูลปริมาณน้อยๆ จากตารางดีขึ้น ดังนั้นเราจึงควรสร้าง อินเด็กซ์บนตารางที่ถูกคิวรี่ในจำนวนบรรทัดต่ำกว่า 15% บ่อยๆ ซึ่งค่านี้สามารถปรับเปลี่ยนได้ตามความเหมาะสมตามสถานการณ์ที่ว่า จำนวนข้อมูลแค่ไหนที่อินเด็กซ์สามารถเรียกได้หรือคอลัมน์ใดๆ บนอินเด็กซ์ที่ต้องการใช้ในการ Join กับตารางอื่นๆ

ค่าเรโชของค่าเฉพาะบน column (Distinct value) ต่อจำนวนข้อมูลบนตารางจะถูกนำมาใช้ในการคำนวนหา Selectivity ของอินเด็กซ์นั้นๆ ซึ่ง Selectivity ในอุดมคติคือเท่ากับ 1 เทียบได้กับการใช้อินเด็กซ์แบบ Unique บน NOT NULL column นั่นเอง

Continue Reading