วิธีการ หลีกเลี่ยงการใช้ 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 ได้ล่วงหน้า
ขั้นตอนในการกำจัดคอร์เซอร์
-
สร้างตาราง XRef: เนื่องจากคุณรู้ว่าค่าที่แตกต่างกันมีความคงที่ สร้างตาราง XRef เพื่อเก็บค่าที่เหล่านี้
-
แทรกค่า: คุณสามารถเรียกใช้
proc_code_xref
100 ครั้ง แทรกผลลัพธ์โดยตรงลงในตาราง XRef ที่เพิ่งสร้างขึ้น -
ทำการอัปเดตโดยใช้ 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 ฐานข้อมูลของคุณมีประสิทธิภาพโดยไม่สูญเสียความชัดเจนของโค้ดของคุณ