อะไรจะมีประสิทธิภาพมากกว่ากัน - การจัดการกับคำสั่ง case ใน sql หรือการจัดการข้อมูลเดียวกันโดยใช้คำสั่ง if ในโค้ด ฉันถามเพราะเพื่อนร่วมงานของฉันมีคำถามมากมายซึ่งมีคำชี้แจงกรณีและปัญหามากมาย ฉันแนะนำให้เธอคลายความเครียดจาก DB ด้วยการเขียนคำสั่ง case ฉันพบว่ามันมีประสิทธิภาพมากกว่า...แต่ทำไมล่ะ?
คำชี้แจงกรณีเทียบกับคำสั่งที่เข้ารหัสถ้า
คำตอบ (5)
มีคำถามพื้นฐานเพิ่มเติมที่ไม่ได้ถูกถามที่นี่: คำสั่ง CASE
เหล่านี้ทำอะไรจริงๆ
ลืมประสิทธิภาพไปได้เลย ถ้า CASE
ถูกใช้เพื่อแปลงผลลัพธ์สุดท้ายของแบบสอบถามเท่านั้น และจริง ๆ แล้วเป็นไปได้ที่จะแทนที่ฟังก์ชันการทำงานเดียวกันด้วย if
หรือ select case
ใน ASP ก็อาจหมายความว่าแบบสอบถาม/ขั้นตอนฐานข้อมูลกำลังพยายามทำสิ่งต่าง ๆ ที่ UI ควรรับผิดชอบเช่นการจัดรูปแบบ ปัญหาการแยกข้อกังวลนั้นร้ายแรงกว่าปัญหาด้านประสิทธิภาพใดๆ ที่เป็นไปได้
หากคุณมีคำถามเช่นนี้:
SELECT InvoiceID, InvoiceDate,
CASE WHEN PaidStatus = 0 THEN 'Unpaid' ELSE 'Paid' END
FROM ...
นี่เป็นเพียงเรื่องไร้สาระ เนื่องจาก UI หรือเลเยอร์ใดก็ตามที่ทำการแมปข้อมูลกับโดเมน ควรรู้วิธีแปลงสถานะในฐานข้อมูลเป็นคำอธิบายที่เกี่ยวข้อง มันไม่สมเหตุสมผลเลยที่จะรวมตรรกะนี้ไว้ในแบบสอบถามด้วย
ในทางกลับกัน หากโครงสร้าง CASE
เป็นส่วนสำคัญของแบบสอบถาม เช่น:
SELECT
SUM(CASE WHEN PaidStatus = 0 THEN Amount ELSE 0 END) AS TotalUnpaid,
SUM(CASE WHEN PaidStatus = 1 THEN Amount ELSE 0 END) AS TotalPaid
FROM ...
อย่าแม้แต่จะพยายามย้ายตรรกะประเภทนี้ไปยัง UI เนื่องจากฐานข้อมูลนั้นมากดีกว่ามาก และ CASE
เป็นส่วนหนึ่งของแบบสอบถามตามความหมาย ("คำนวณจำนวนเงินที่ชำระและยังไม่ได้ชำระทั้งหมดสำหรับ x") โดยจะไม่เข้าควบคุมฟังก์ชัน UI ใด ๆ
กังวลก่อนว่าตรรกะนั้นอยู่ตรงไหนโดยอิงจากความตั้งใจที่จะทำให้สำเร็จ ข้อกังวลด้านประสิทธิภาพควรเข้าสู่การสนทนาเฉพาะในกรณีที่คุณสังเกตเห็นปัญหาประสิทธิภาพที่สำคัญจริงๆ
ควรใช้คำสั่ง CASE
เนื่องจาก:
- SQL: เป็นมาตรฐาน ANSI ทำให้สามารถพกพาไปยังฐานข้อมูลอื่นได้โดยไม่จำเป็นต้องแก้ไข
- รองรับการลัดวงจร
จากประสบการณ์ของฉัน เซิร์ฟเวอร์ฐานข้อมูลของเรามีขนาดใหญ่กว่าเซิร์ฟเวอร์แอปพลิเคชันของเรามากและโดยปกติจะไม่ได้ใช้งานต่ำกว่า 30% ให้ฐานข้อมูลจัดการข้อมูล จากนั้นให้ไคลเอ็นต์วนซ้ำผ่านชุดผลลัพธ์ แนวทางปฏิบัติที่ดีกว่าคือให้ฐานข้อมูลส่งคืนเฉพาะข้อมูลที่คุณต้องการ (หากคุณสามารถระบุสิ่งนี้ล่วงหน้าได้)
คุณควรสืบค้น (กรองและเรียงลำดับ) ข้อมูลในฐานข้อมูล และปล่อยให้การนำเสนออยู่ในระดับการนำเสนอ นี่เป็นเพราะเหตุผลสำคัญสองประการ:
- ฐานข้อมูลถูกสร้างขึ้นเพื่อกรองและเรียงลำดับข้อมูล
- คุณต้องการดึงข้อมูลจำนวนน้อยที่สุดจากฐานข้อมูลตามความจำเป็น
ตามที่ฉันอ่าน คำถามพื้นฐานคือ CASE ดีกว่า IF ใน SQL หรือไม่ คำตอบยังขึ้นอยู่กับความลึกของเงื่อนไขของคุณด้วย พบบทความดีๆที่นี่ อาจเป็นประโยชน์กับใครบางคน http://www.4guysfromrolla.com/webtech/102704-1.shtml