Saya telah melihat banyak orang menggunakan fungsi COALESCE menggantikan ISNULL. Dari pencarian internet, saya telah menemukan bahwa COALESCE adalah standar ANSI, jadi ada keuntungan yang kita tahu apa yang diharapkan ketika menggunakannya. Namun, ISNULL tampaknya lebih mudah dibaca karena tampaknya lebih jelas apa yang dilakukannya.
Saya juga menyadari bahwa ISNULL agak rumit karena bertindak berbeda pada server basis data yang berbeda dan dalam bahasa yang berbeda.
Semua itu, dalam pikiran saya, bermuara pada gaya dan standar. Mengingat gaya itu subjektif, apakah ada alasan untuk menggunakan COALESCE di atas ISNULL (atau sebaliknya)? Secara khusus, apakah ada keunggulan kinerja satu di atas yang lain?
sql-server
syntax
Richard
sumber
sumber
COALESCE
dievaluasi dua kali.COALESCE
itu hanya tidak intuitif;)Jawaban:
COALESCE
diterjemahkan secara internal keCASE
ekspresi,ISNULL
adalah fungsi mesin internal.COALESCE
adalah fungsi standar ANSI,ISNULL
adalah T-SQL.Perbedaan kinerja dapat dan memang muncul ketika pilihan mempengaruhi rencana eksekusi tetapi perbedaan dalam kecepatan fungsi mentah sangat kecil .
sumber
Kemudian
Akhirnya, dan sedikit kesenangan. Datatype hasil dan panjang / presisi / skala
Bit terakhir ini adalah mengapa ISNULL biasanya digunakan karena lebih dapat diprediksi (?) Dan COALESCE dapat menambahkan konversi tipe data yang tidak diinginkan: dari sinilah bit "lebih lambat" berasal
Semua tipe data sama, Anda tidak akan melihat perbedaan praktis ...
sumber
Seperti yang ditunjukkan oleh Mark, Anda akan kesulitan menemukan perbedaan kinerja; Saya pikir faktor lain akan lebih penting. Bagi saya, saya selalu menggunakan COALESCE, dan sebagian besar sudah disebutkan oleh Anda atau Tandai:
Anda juga harus yakin mengetahui bagaimana presedensi tipe data ditangani menggunakan dua fungsi jika Anda menggunakannya dengan tipe data yang berbeda / precision dll.
Catatan
Ada satu pengecualian. Ini ditangani secara berbeda dalam versi SQL Server saat ini:
The
COALESCE
varian benar-benar akan mengeksekusisome_aggregate_query
dua kali (sekali untuk memeriksa nilai, dan sekali untuk kembali ketika non-nol), sementaraISNULL
hanya akan mengeksekusi subquery sekali. Saya berbicara tentang beberapa perbedaan lain di sini:sumber