วิธีการ หลีกเลี่ยงการใช้ Cursors ใน Sybase (T-SQL)

Cursors ใน SQL มักเป็นแหล่งของความหงุดหงิด โดยเฉพาะเมื่ออัปเดตโค้ดเก่า พวกมันสามารถนำไปสู่การเขียน query ที่ซับซ้อนและไม่มีประสิทธิภาพ ทำให้ประสิทธิภาพของฐานข้อมูลช้าลง ในบล็อกโพสต์นี้ เราจะสำรวจว่า คุณสามารถกำจัดการใช้คอร์เซอร์ใน query Sybase (T-SQL) ของคุณอย่างมีประสิทธิภาพได้อย่างไร ทำให้ Stored Procedures ของคุณมีประสิทธิภาพมากขึ้นและง่ายต่อการบำรุงรักษา

ปัญหาของคอร์เซอร์

ลองนึกภาพว่าคุณได้รับมอบหมายให้ปรับปรุงโค้ด Sybase เก่า และคุณพบคอร์เซอร์ตัวหนึ่ง คอร์เซอร์นี้ถูกใช้เพื่อประมวลผลชุดผลลัพธ์ แต่ไม่ค่อยมีประสิทธิภาพ—โดยเฉพาะอย่างยิ่งเมื่อทำงานกับชุดข้อมูลขนาดใหญ่ ตัวอย่างเช่น สมมติว่าคุณมีชุดผลลัพธ์ที่มี 500,000 แถว และ 100 ค่าที่แตกต่างกัน ที่ต้องประมวลผล การใช้คอร์เซอร์สำหรับงานเช่นนี้อาจนำไปสู่ปัญหาด้านประสิทธิภาพและโค้ดที่ซับซ้อนมากกว่าที่จำเป็น

ตัวอย่างคอร์เซอร์ทั่วไป

เพื่อแสดงให้เห็น นี่คือตัวอย่างโค้ดที่ใช้คอร์เซอร์ในการอัปเดตตารางชั่วคราวตาม Stored Procedure:

declare c_lookup_codes for 
select distinct lookup_code 
from #workinprogress

while(1=1) 
begin 
    fetch c_lookup_codes into @lookup_code 

    if @@sqlstatus<>0 
    begin 
        break 
    end 

    exec proc_code_xref @lookup_code @xref_code OUTPUT 

    update #workinprogress 
    set xref = @xref_code 
    where lookup_code = @lookup_code 
end

ในขณะที่โค้ดนี้อาจทำงานได้ แต่มันยังห่างไกลจากความเหมาะสม มาสำรวจวิธีการกำจัดคอร์เซอร์ออกไปทั้งหมดกันเถอะ

วิธีแก้ปัญหา: การใช้ตาราง XRef

เพื่อหลีกเลี่ยงการใช้คอร์เซอร์ หนึ่งในวิธีที่มีประสิทธิภาพคือการสร้าง ตาราง Cross-reference (XRef) โดยการทำเช่นนี้ คุณสามารถเติมค่าที่จำเป็นทั้งหมดที่คุณต้องการจาก Stored Procedure ในตาราง XRef ได้ล่วงหน้า

ขั้นตอนในการกำจัดคอร์เซอร์

  1. สร้างตาราง XRef: เนื่องจากคุณรู้ว่าค่าที่แตกต่างกันมีความคงที่ สร้างตาราง XRef เพื่อเก็บค่าที่เหล่านี้

  2. แทรกค่า: คุณสามารถเรียกใช้ proc_code_xref 100 ครั้ง แทรกผลลัพธ์โดยตรงลงในตาราง XRef ที่เพิ่งสร้างขึ้น

  3. ทำการอัปเดตโดยใช้ Joins: แทนที่จะดึงค่าภายในลูป คุณสามารถใช้คำสั่งอัปเดตเดียวพร้อมการทำงานร่วมกันเพื่ออัปเดตตารางชั่วคราวของคุณ ซึ่งจะลดความซับซ้อนและเพิ่มประสิทธิภาพเป็นอย่างมาก

ตัวอย่างโค้ดโดยไม่ใช้คอร์เซอร์

นี่คือวิธีที่โค้ดของคุณอาจดูหลังจากนำข้อเสนอแนะแต่ละข้อไปใช้:

-- สร้างตาราง XRef
CREATE TABLE XRef (lookup_code VARCHAR(50), xref_code VARCHAR(50))

-- เติมตาราง XRef
INSERT INTO XRef (lookup_code, xref_code)
SELECT lookup_code, 
       exec proc_code_xref(lookup_code) 
FROM (SELECT DISTINCT lookup_code FROM #workinprogress) AS DistinctValues

-- อัปเดตตาราง #workinprogress โดยใช้ join
UPDATE wp
SET wp.xref = xr.xref_code
FROM #workinprogress wp
JOIN XRef xr ON wp.lookup_code = xr.lookup_code

ข้อดีหลักของแนวทางนี้

  • ประสิทธิภาพที่ดีขึ้น: การกำจัดคอร์เซอร์หมายความว่าเครื่องมือฐานข้อมูลสามารถเพิ่มประสิทธิภาพการประมวลผลได้อย่างมีประสิทธิภาพมากขึ้น
  • โค้ดที่เรียบง่าย: การใช้คำสั่งอัปเดตเดียวทำให้ตรรกะอ่านเข้าใจง่ายและบำรุงรักษาได้ง่ายขึ้น
  • ความสามารถในการขยายตัว: วิธีการนี้สามารถปรับเปลี่ยนได้ง่ายหากจำนวนค่าการค้นหาที่แตกต่างกันเปลี่ยนแปลงไป

สรุป

โดยการเปลี่ยนผ่านจากคอร์เซอร์และใช้ตาราง cross-reference คุณสามารถเพิ่มประสิทธิภาพและความสามารถในการบำรุงรักษาของโค้ด Sybase T-SQL ของคุณ ในโลกของฐานข้อมูล แต่ละบิตของการเพิ่มประสิทธิภาพมีความสำคัญ โดยเฉพาะเมื่อจัดการกับชุดข้อมูลขนาดใหญ่ จำไว้ว่ายิ่ง SQL ของคุณสะอาดและตรงไปตรงมามากเท่าไหร่ มันก็ยิ่งทำงานได้ดีเท่านั้น

ความคิดสุดท้าย

หากคุณพบว่าตัวเองต้องจัดการกับคอร์เซอร์ในโค้ดของคุณบ่อยๆ ขอแนะนำให้พิจารณาสำรวจวิธีการทางเลือกเช่นวิธีการนี้ ด้วยวิธีการที่ถูกต้อง คุณสามารถทำให้การ query ฐานข้อมูลของคุณมีประสิทธิภาพโดยไม่สูญเสียความชัดเจนของโค้ดของคุณ