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

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

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

Adaptive direct path read บน Oracle 11g คืออะไร?


สวัสดีครับ! ก็ไม่ได้เขียนบทความซะนานต้องขออภัยจริงๆ เพราะว่าช่วงนี้งานโถมเข้าใส่แบบไม่ยั้ง ฮ่าๆ วันนี้เลยบอกตัวเองว่างานหนักยังไงก็ต้องเขียนบทความใหม่ให้ได้ โดยส่วนตัวถือเป็นความรู้ใหม่ของตัวเองด้วย เลยอยากให้ทุกคน(ที่เผลอเข้ามาอ่าน) ได้รับรู้ไปกับผมด้วยครับ และในวันนี้ผมจะพูดถึง Adaptive direct path read บน Oracle 11g มันคืออะไร? ดีหรือไม่อย่างไร? ลองอ่านกันดูครับ:)

Continue Reading

APPEND hint เคล็ด(ไม่)ลับสำหรับการ INSERT ข้อมูล


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

APPEND hint มีผลต่อประสิทธิภาพอย่างไร?

โดยวิธีการทำงานของ APPEND hint นั้นมันจะทำการ insert ข้อมูลโดยตรงลงบน data files ซึ่งจะทำให้ประสิทธิภาพในการ INSERT … SELECT ดีขึ้นดังนี้

Continue Reading