สำหรับหลายๆ ท่านที่เคยเขียน Stored procedure ในฐานข้อมูล น่าจะเคยเขียน Cursor มากันบ้างแล้ว โดยในการใช้ cursor นั้น ส่วนใหญ่เรามักจะใช้ตอนเวลาที่ต้องการเขียนโปรแกรมที่ค่อนข้างที่จะซับซ้อน หรือไม่ก็หมดมุกในการเขียน query หรือ sql statement แล้วจริงๆ พอนึกไม่ออกก็วนเข้ามาหา cursor กันซะทุกที (จริงไหมครับ) โดยหารู้ไม่ว่า ไอ้ cursor นี่แหล่ะ จะเป็นตัวร้ายสำหรับ Performance เลย
จากประสบการณ์ส่วนตัวของผม เวลาใช้งาน cursor ทีไร จะรู้สึกว่า stored procedure ทำงานช้าขึ้นมาทันทีเลยครับ แต่ก็ไม่รู้ว่าทำไมถึงช้า ผมก็เลยได้ไปค้นคว้ามาว่า ทำไม cursor ถึงช้า ตามหัวข้อด้านล่างครับ
- ขณะที่ cursor ทำงานจะเกิด data lock ซึ่งแน่นอนครับ มีผลทำให้ user คนอื่นๆ ที่บังเอิญ (ซวย) มาใช้ Table เดียวกัน ต้องรอ รอ รอ รอจนกว่า cursor จะทำงานเสร็จ (สุดยอด)
- การใช้ cursor จะเหมือนกับรันคำสั่ง select เท่ากับจำนวน record ที่ cursor ทำงานด้วย เช่น สมมุติว่าเราสร้าง cursor เพื่อชี้ไปยัง data ชุดนึงที่มี record อยู่ 1,000 records ทีนี้เราก็จะต้องเลื่อน cursor ไปหา record ที่เราชี้ไปทีละ record ใช่ไหมครับ ข่าวร้ายก็คือ เวลาเราเลื่อน record โดยใช้คำสั่ง fetch จะต้องรันคำสั่ง select ใหม่ทุกครั้ง ดังนั้นก็เหมือนว่าเราจะต้องรันคำสั่ง select 1,000 ครั้งนั่นเองครับ
- จากข้อ 2 ก็เลยมีผลทำให้ cursor ใช้ memory มากขึ้นกว่าปกติครับ สรุปว่าทำให้ช้าเข้าไปอีก
- cursor ใช้ network bandwidth ที่มากกว่าปกติในการส่งผลลัพธ์ไปให้ยังเครื่องของ User
สรุปว่า ถ้าไม่จำเป็นจริงๆ เราก็ไม่ควรใช้ cursor ครับ แต่ให้หันไปใช้ statement อย่างอื่นแทน เช่น join statement เป็นต้น เพราะมีหลายครั้งที่เราสามารถใช้ join statement แทน cursor ได้ครับ แต่ถ้า join statement ใช้ไม่ได้ ก็ต้องหาวิธีอื่นแหล่ะครับ แต่จะวิธีไหนนั้น เอาไว้ผมจะเขียนอธิบายในตอนต่อๆ ไปครับ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น