Home > SQL Performance Tuning > เหตุผลที่เราไม่ใช้ Cursor ใน SQL Server

เหตุผลที่เราไม่ใช้ Cursor ใน SQL Server


สำหรับหลายๆ ท่านที่เคยเขียน Stored procedure ในฐานข้อมูล น่าจะเคยเขียน Cursor มากันบ้างแล้ว โดยในการใช้ cursor นั้น ส่วนใหญ่เรามักจะใช้ตอนเวลาที่ต้องการเขียนโปรแกรมที่ค่อนข้างที่จะซับซ้อน หรือไม่ก็หมดมุกในการเขียน query หรือ sql statement แล้วจริงๆ พอนึกไม่ออกก็วนเข้ามาหา cursor กันซะทุกที (จริงไหมครับ) โดยหารู้ไม่ว่า ไอ้ cursor นี่แหล่ะ จะเป็นตัวร้ายสำหรับ Performance เลย

จากประสบการณ์ส่วนตัวของผม เวลาใช้งาน cursor ทีไร จะรู้สึกว่า stored procedure ทำงานช้าขึ้นมาทันทีเลยครับ แต่ก็ไม่รู้ว่าทำไมถึงช้า ผมก็เลยได้ไปค้นคว้ามาว่า ทำไม cursor ถึงช้า ตามหัวข้อด้านล่างครับ

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

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

หลักสูตรอบรม SQL Tuning (click)

 

 

  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

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 / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: