คำชี้แจงกรณีเทียบกับคำสั่งที่เข้ารหัสถ้า

อะไรจะมีประสิทธิภาพมากกว่ากัน - การจัดการกับคำสั่ง case ใน sql หรือการจัดการข้อมูลเดียวกันโดยใช้คำสั่ง if ในโค้ด ฉันถามเพราะเพื่อนร่วมงานของฉันมีคำถามมากมายซึ่งมีคำชี้แจงกรณีและปัญหามากมาย ฉันแนะนำให้เธอคลายความเครียดจาก DB ด้วยการเขียนคำสั่ง case ฉันพบว่ามันมีประสิทธิภาพมากกว่า...แต่ทำไมล่ะ?


person Eric    schedule 11.03.2010    source แหล่งที่มา
comment
นี่เป็นเรื่องที่คลุมเครือ โดยทั่วไปแล้ว ผู้คนจะแนะนำให้คุณจัดการกับการสืบค้นข้อมูล DB ในฐานข้อมูล และจำไว้ว่าคุณอาจพบปัญหามากมายในการพยายามรักษารูปแบบ db ในโค้ด (กลุ่ม/สหภาพ/ความแตกต่าง) นั่นคือสิ่งที่ dbs ถูกสร้างขึ้นมาเพื่อ...   -  person Adriaan Stander    schedule 12.03.2010
comment
สำหรับฉันแล้วดูเหมือนว่าคุณควรกำหนดเป้าหมายคำถามนี้ไปที่ผู้พัฒนา DB มากขึ้น แท็ก sql เดียวยังไม่เพียงพอ คุณใช้ฐานข้อมูล SQL รสชาติใด   -  person AnthonyWJones    schedule 12.03.2010


คำตอบ (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 ใด ๆ

กังวลก่อนว่าตรรกะนั้นอยู่ตรงไหนโดยอิงจากความตั้งใจที่จะทำให้สำเร็จ ข้อกังวลด้านประสิทธิภาพควรเข้าสู่การสนทนาเฉพาะในกรณีที่คุณสังเกตเห็นปัญหาประสิทธิภาพที่สำคัญจริงๆ

person Aaronaught    schedule 12.03.2010
comment
คำตอบที่ดี! มีประโยชน์มาก! สิ่งที่ฉันกำลังมองหา - person Eric; 12.03.2010
comment
แม้ว่านี่จะเป็นคำตอบที่ดีและจริงใจมาก แต่ฉันไม่รู้สึกว่ามันจะตอบคำถามได้จริงเลย เช่นเดียวกับทั้งหมดนี้มีความสำคัญมากกว่ามาก แต่มันก็ค่อนข้างจะเกี่ยวพันกับการพูดคุยของ UI และกระโปรงรอบคำถาม และคุณระบุว่า...สังเกตเห็นปัญหาประสิทธิภาพที่สำคัญ ขาดการวัดประสิทธิภาพและการทดสอบ ถามคำถาม ซึ่งมีประสิทธิภาพมากกว่าจากผู้ที่รู้อยู่แล้วน่าจะเป็นวิธีที่ดีที่สุด - person Sean_A91; 15.09.2018
comment
ผ่านมาระยะหนึ่งแล้ว แต่ขอบคุณสำหรับคำอธิบายที่ยอดเยี่ยมนี้! ช่วยฉันจัดบางอย่าง;) - person Daniel; 18.11.2019

ควรใช้คำสั่ง CASE เนื่องจาก:

  • SQL: เป็นมาตรฐาน ANSI ทำให้สามารถพกพาไปยังฐานข้อมูลอื่นได้โดยไม่จำเป็นต้องแก้ไข
  • รองรับการลัดวงจร
person OMG Ponies    schedule 11.03.2010

จากประสบการณ์ของฉัน เซิร์ฟเวอร์ฐานข้อมูลของเรามีขนาดใหญ่กว่าเซิร์ฟเวอร์แอปพลิเคชันของเรามากและโดยปกติจะไม่ได้ใช้งานต่ำกว่า 30% ให้ฐานข้อมูลจัดการข้อมูล จากนั้นให้ไคลเอ็นต์วนซ้ำผ่านชุดผลลัพธ์ แนวทางปฏิบัติที่ดีกว่าคือให้ฐานข้อมูลส่งคืนเฉพาะข้อมูลที่คุณต้องการ (หากคุณสามารถระบุสิ่งนี้ล่วงหน้าได้)

person northpole    schedule 11.03.2010

คุณควรสืบค้น (กรองและเรียงลำดับ) ข้อมูลในฐานข้อมูล และปล่อยให้การนำเสนออยู่ในระดับการนำเสนอ นี่เป็นเพราะเหตุผลสำคัญสองประการ:

  • ฐานข้อมูลถูกสร้างขึ้นเพื่อกรองและเรียงลำดับข้อมูล
  • คุณต้องการดึงข้อมูลจำนวนน้อยที่สุดจากฐานข้อมูลตามความจำเป็น
person Keith Adler    schedule 11.03.2010

ตามที่ฉันอ่าน คำถามพื้นฐานคือ CASE ดีกว่า IF ใน SQL หรือไม่ คำตอบยังขึ้นอยู่กับความลึกของเงื่อนไขของคุณด้วย พบบทความดีๆที่นี่ อาจเป็นประโยชน์กับใครบางคน http://www.4guysfromrolla.com/webtech/102704-1.shtml

person Ram Dwivedi    schedule 08.01.2014
comment
มันค่อนข้างดี! น่าเสียดายที่มันไม่ได้พูดอะไรเกี่ยวกับการแสดงเลย - person Zoltán Süle; 24.09.2020