ความแตกต่างของประสิทธิภาพสำหรับ COALESCE เทียบกับ ISNULL หรือไม่


48

ฉันเคยเห็นผู้คนจำนวนมากใช้ฟังก์ชัน COALESCE แทน ISNULL จากการค้นหาทางอินเทอร์เน็ตฉันพบว่า COALESCE เป็นมาตรฐาน ANSI ดังนั้นจึงมีข้อได้เปรียบที่เรารู้ว่าจะเกิดอะไรขึ้นเมื่อใช้งาน อย่างไรก็ตาม ISNULL อ่านง่ายขึ้นเนื่องจากดูเหมือนชัดเจนยิ่งขึ้นว่ากำลังทำอะไรอยู่

ฉันยังตระหนักว่า ISNULL นั้นค่อนข้างยุ่งยากเนื่องจากมันทำงานต่างกันในเซิร์ฟเวอร์ฐานข้อมูลที่แตกต่างกัน

จากทั้งหมดนี้ในใจของฉันทำให้สไตล์และมาตรฐานเป็นที่ชื่นชอบ มีรูปแบบที่เป็นอัตนัยมีเหตุผลใดบ้างที่จะใช้ COALESCE บน ISNULL (หรือในทางกลับกัน) มีข้อได้เปรียบด้านประสิทธิภาพการทำงานของอีกตัวหนึ่งหรือไม่?


1
ฉันไม่เห็นกล่าวถึงในคำตอบใด ๆ ที่แบบสอบถามย่อยในการCOALESCE ได้รับการประเมินสองครั้ง
Martin Smith

4
"ISNULL อ่านง่ายขึ้นเนื่องจากดูเหมือนชัดเจนว่ากำลังทำอะไรอยู่" - จริงหรือ ฉันพบชื่อตอบโต้ที่ไม่ได้ใช้งานง่าย: ฉันคาดหวังให้ส่งคืนบูลีนที่ระบุว่านิพจน์นั้นเปลี่ยนเป็นโมฆะหรือไม่ทราบ ชื่อCOALESCEเป็น unintuitive เพียง;)
onedaywhen

คำตอบ:


26

COALESCEถูกแปลภายในเป็นการCASEแสดงออกซึ่งISNULLเป็นฟังก์ชั่นเครื่องยนต์ภายใน

COALESCEเป็นฟังก์ชั่นมาตรฐาน ANSI ISNULLคือ T-SQL

ความแตกต่างของประสิทธิภาพสามารถเกิดขึ้นได้เมื่อตัวเลือกมีผลต่อแผนการดำเนินการ แต่ความแตกต่างในความเร็วของฟังก์ชั่นดิบคือความไม่แน่นอน


40
  • ISNULL เป็น Sybase / SQL Server เฉพาะ
  • COALESCE เป็นแบบพกพา

แล้วก็

  • ISNULL รับอาร์กิวเมนต์ 2 ตัว
  • COALESCE รับอาร์กิวเมนต์ 1-n

ในที่สุดและบิตสนุก ประเภทข้อมูลผลลัพธ์และความยาว / ความแม่นยำ / สเกล

บิตสุดท้ายนี้คือสาเหตุที่มักใช้ ISNULL เนื่องจากสามารถคาดการณ์ได้มากขึ้น (?) และ COALESCE สามารถเพิ่มการแปลงประเภทข้อมูลที่ไม่ได้ตั้งใจ: ซึ่งบิต "มาช้ากว่า" มาจากไหน

DECLARE @len10 varchar(10); --leave it NULL
SELECT
    ISNULL(@len10, '0123456789ABCDEF'),     -- gives 0123456789
    COALESCE(@len10, '0123456789ABCDEF');   -- gives 0123456789ABCDEF

ประเภทข้อมูลทั้งหมดเป็นแบบเดียวกันคุณจะไม่เห็นความแตกต่างในทางปฏิบัติใด ๆ ...


22

ดังที่มาร์คชี้ให้เห็นคุณจะต้องเผชิญกับความยากลำบากในการค้นหาความแตกต่างของประสิทธิภาพ ฉันคิดว่าปัจจัยอื่น ๆ จะมีความสำคัญมากกว่า สำหรับฉันฉันมักจะใช้ COALESCE และส่วนใหญ่แล้วคุณหรือ Mark พูดถึง:

  • COALESCE เป็นมาตรฐาน ANSI มันเป็นสิ่งที่ฉันกังวลน้อยกว่าถ้าฉันจะย้ายรหัสของฉัน สำหรับฉันเป็นการส่วนตัวนี้ไม่สำคัญเพราะฉันรู้ว่าพอร์ตดังกล่าวเกิดขึ้นไม่บ่อยนักนอกโลกห้องเรียนของ Celko แต่สำหรับบางคนนี่เป็นประโยชน์
  • ตรงกันข้ามกับสิ่งที่คุณพูดเกี่ยวกับความสามารถในการอ่านฉันพบว่ามันยากที่จะอ่าน ISNULL โดยเฉพาะอย่างยิ่งสำหรับผู้ใช้ที่มาจากภาษาอื่นหรือแพลตฟอร์มที่ ISNULL ส่งคืนบูลีน (ซึ่งไม่มีอยู่ใน SQL Server) ได้รับ COALESCE นั้นยากที่จะสะกด แต่อย่างน้อยมันก็ไม่ได้นำไปสู่ข้อสมมติฐานที่ไม่ถูกต้อง
  • COALESCE มีความยืดหยุ่นมากขึ้นฉันสามารถพูด COALESCE (a, b, c, d) ในขณะที่ด้วย ISNULL ฉันต้องทำรังหลายอย่างเพื่อให้ได้สิ่งเดียวกัน

คุณควรแน่ใจว่าคุณทราบถึงวิธีการจัดการลำดับความสำคัญของชนิดข้อมูลโดยใช้ฟังก์ชันทั้งสองถ้าคุณใช้กับประเภท / เขตข้อมูลต่าง ๆ เป็นต้น

บันทึก

มีข้อยกเว้นอย่างหนึ่งคือ สิ่งเหล่านี้ได้รับการจัดการแตกต่างกันไปใน SQL Server เวอร์ชันปัจจุบัน:

SELECT COALESCE((SELECT some_aggregate_query),0); 

SELECT ISNULL((SELECT some_aggregate_query),0); 

COALESCEตัวแปรจริงจะดำเนินการsome_aggregate_queryสองครั้ง (ครั้งเพื่อตรวจสอบค่าและเมื่อจะกลับมาเมื่อไม่เป็นศูนย์) ในขณะที่ISNULLจะดำเนินการแบบสอบถามย่อยครั้ง ฉันพูดถึงความแตกต่างอื่น ๆ ไม่กี่ที่นี่:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.