Fragment และผลกระทบต่อ Full table scan


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

Continue Reading

โฆษณา

Execution plan เหตุใดเจ้าจึงเปลี่ยนไป?


สวัสดีครับ ช่วงนี้นานๆ เข้ามาเขียนซักทีนึงนะครับ แล้ววันนี้ผมก็จะมาบอกเล่าเรื่องราวเกี่ยวกับสิ่งที่เป็นหัวใจสำคัญสำหรับการ Tuning นั้นคือ Execution plan ของแต่ละ SQL statement ว่าเพราะสาเหตุใดบ้างที่ทำให้การคิวรี่ข้อมูลรู้สึกช้าลงหรือแตกต่างออกไปทั้งที่ SQL statement ก็ยังเหมือนเดิม ลองมาดูกันครับ

Continue Reading

ช้านักก็ปักหมุด ตอนที่ 1: dbms_shared_pool.keep


สำหรับตอนนี้ผมให้ชื่อว่า “ช้านักก็ปักหมุด” คำว่าปักหมุดในที่นี้ผมหมายถึง Pin ซึ่งผมจะแบ่งเป็น 2 ตอน ตือเรื่องราวเกี่ยวกับ dbms_shared_pool.keep ซึ่งเป็นการกำหนดให้ pin package ใดๆ ไว้บน Shared pool ซึ่งช่วยทำให้ประสิทธิภาพของฐานข้อมูลดีขึ้น และอีกส่วนหนึ่งก็คือ db_keep_cache_size พารามิเตอร์ที่ใช้กำหนดพื้นที่เก็บข้อมูล (Table,index) ที่เราต้องการให้มันอยู่บนหน่วยความจำเสมอซึ่งคือการ Pin table หรือ Pin index ขึ้นไปอยู่บนหน่วยความจำนั่นเอง เอาละครับ! มาดูกัน…

Continue Reading

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


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

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

Continue Reading

ORA-01000 Maximum Cursors Exceeded! เจ้าตายแล้ว!


ห่างหายไปนานเลยครับ ฮ่าๆ ช่วงนี้งานชุกมากๆ แต่ยังไงวันนี้ก็มีเรื่องราวดีๆ มาฝากเหมือนเดิม ORA-01000

นี้มัน Error อะไรกันอีกเนี่ย! ORA-01000 maximum open cursors exceeded! เคยเจอกันไหมครับ? เคยหล่ะซิ โอเค วันนี้ผมจะมางัดแงะแกะเกา Error message ตัวนี้ให้ทุกคนเข้าใจตรงกันนะครับ!

ORA-01000 maximum open cursors exceeded
Cause: A host language program attempted to open too many cursors. The initialization parameter OPEN_CURSORS determines the maximum number of cursors per user.
Action: Modify the program to use fewer cursors. If this error occurs often, shut down Oracle, increase the value of OPEN_CURSORS, and then restart Oracle.

Continue Reading

ORA-1652 TEMP เต็ม! ทำไงดีอ่ะ?


สวัสดีครับ เดียวเริ่มตั้งแต่ช่วงเดือนหน้าผมอาจจะมีเรื่องมาแชร์ทุกคนมากขึ้นครับ เนื่องจากจะเริ่มทำการเตรียมตัวสอบเพื่อเอา Oracle 11g Performance Tuning Certified Expert ถ้าเจอเรื่องอะไรน่าสนใจก็จะเอามาลงแบ่งปันกันเหมือนเดิมครับและสำหรับวันนี้ผมขอเกริ่นนำกันก่อนละกันนะครับ เราจะทำอย่างไรดีถ้า Temporary tablespace เต็ม? ซึ่งเราอาจจะทราบว่ามันจะเกิด ORA-1652: unable to extend temp segment ใน Alert log ขึ้น แล้วทำไงดีหละ? มันเต็มไปแล้วอ่ะ… วันนี้ผมเอาความรู้เกี่ยวกับ Temporary tablespace วิธีการมอนิเตอร์และรับมือกับปัญหา ORA-1652 มาฝากครับ

Continue Reading

Keepalive บน Oracle Database: SQLNET.EXPIRE_TIME


วันนี้จะเอาเคสที่เจอสดๆ ร้อนๆ เมื่อไม่นานนี้เองมาเล่าให้ฟังครับ เริ่มเรื่องมาจากทาง Developer team ต้องการสร้าง Connection บนดาต้าเบสทิ้งไว้คล้ายๆ การทำงานของ On-demand batch ซึ่งเค้าต้องการให้ Establish session ทิ้งเอาไว้ แต่ผลจากการเทสปรากฏว่า Database session ถูก terminate ออกจากระบบหลังจากที่ Connect เข้ามาทุกๆ 30 นาที ซึ่งหลังจากตรวจสอบแล้วสันนิษฐานกันว่าเป็นเพราะ Firewall setting ที่คอยตัดการเชื่อมต่อของ Idle connection ครับ และหลังจากตรวจสอบ OS parameter ที่เกี่ยวข้อง TCP Keepalive ซึ่งก็คือ net.ipv4.tcp_keepalive_time พบว่าเป็นค่า Default ซึ่งก็คือ 2 ชั่วโมง

แล้วทำยังไงถึงจะแก้ปัญหานี้ได้หละ???

Continue Reading