COALESCE - ISNULL için performans farkı?


48

ISNULL yerine COALESCE işlevini kullanan bir çok insan gördüm. İnternet aramalarından, COALESCE’in ANSI standardı olduğunu öğrendim, bu yüzden kullanırken ne olacağını bilmemizin bir avantajı var. Ancak, ISNULL, ne yaptığı daha net göründüğü için okunması daha kolay görünüyor.

Ayrıca, farklı veritabanı sunucularında ve farklı dillerde farklı davrandığı için ISNULL’in biraz zor olduğunu fark ediyorum.

Bütün bunlar, aklımda stil ve standartlara bağlı. Bu tarz öznel olduğu göz önüne alındığında, COALESCE'i ISNULL (ya da tam tersi) üzerinde kullanmak için herhangi bir neden var mı? Özellikle, birinin diğerine göre performans avantajı var mı?


1
Aldığı bir alt sorguda COALESCE iki kez değerlendirilen
Martin Smith

4
"ISNULL, ne yaptığını daha açık göründüğü için okuması kolay görünüyor" - gerçekten mi? Karşı sezgisel olmayan bir isim buluyorum: Bir ifadenin boş veya bilinmeyen bir çözüm olup olmadığını belirten bir Boolean döndürmesini beklerdim. Bu isim COALESCEsadece
sezgisel

Yanıtlar:


26

COALESCEdahili olarak bir CASEifadeye çevrilir , ISNULLdahili bir motor işlevidir.

COALESCEANSI standart bir fonksiyonudur, ISNULLT-SQL.

Seçim, uygulama planını etkilediğinde performans farklılıkları ortaya çıkabilir ve ortaya çıkabilir, ancak ham fonksiyon hızındaki fark miniktir .


40
  • ISNULL, Sybase / SQL Server'a özeldir
  • COALESCE taşınabilir

Sonra

  • ISNULL 2 argüman alır
  • COALESCE 1-n argümanlarını alır

Sonunda ve eğlence biti. Sonuç veri türü ve uzunluk / hassasiyet / ölçek

Bu son bit, ISNULL'un genellikle kullanılmasının nedeni daha öngörülebilir (?) Olduğundan ve COALESCE, istenmeyen veri türü dönüşümleri ekleyebildiği için kullanılır: hangisi "daha yavaş" biti gelir

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

Tüm veri tipleri aynıdır, pratik bir fark göremezsiniz ...


22

Mark'ın işaret ettiği gibi, performans farklarını bulmak için çok zorlanacaksınız; Diğer faktörlerin daha önemli olacağını düşünüyorum. Benim için her zaman COALESCE kullanıyorum ve bunun çoğu zaten sizin tarafınızdan veya Mark tarafından belirtildi:

  • COALESCE ANSI standardıdır. Kodumu taşıyacaksam endişelenmem gereken bir şey daha var. Şahsen benim için bu o kadar önemli değil, çünkü bu tür limanların ne kadar sıklıkla Celko'nun sınıf dünyasının dışında gerçekleştiğini biliyorum, ancak bazı insanlara bunun bir faydası var.
  • Okunabilirlik hakkında söylediklerinizin aksine, özellikle ISNULL'un bir boole döndürdüğü (SQL Server'da bulunmayan) diğer dillerden veya platformlardan gelen kullanıcılar için ISNULL'u okumak daha zor olabilir . Verilmiş, COALESCE'in hecelenmesi daha zor, ancak en azından yanlış varsayımlara yol açmıyor.
  • COALESCE, COALESCE (a, b, c, d) diyebileceğimden çok daha esnektir, oysa ISNULL ile aynı şeyi elde etmek için çok fazla yuva yapmak zorunda kalacağım.

Veri türü önceliğinin farklı işlevler / veriler vb. İle kullanıyorsanız, iki işlev kullanılarak nasıl işlendiğini bildiğinizden de emin olmalısınız.

Not

Bir istisna var. Bunlar, SQL Server'ın mevcut sürümlerinde farklı şekilde ele alınır:

SELECT COALESCE((SELECT some_aggregate_query),0); 

SELECT ISNULL((SELECT some_aggregate_query),0); 

COALESCEVaryant çalıştırılacak olan asıl some_aggregate_query(değerini kontrol etmek kez ve sıfır olmayan zaman bir kez dönmek için) iki kez, süre ISNULLsadece bir kez alt sorgu çalıştırır. Burada birkaç başka farklılıktan söz ediyorum:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.