Differenza prestazionale per COALESCE rispetto a ISNULL?


48

Ho visto molte persone usare la funzione COALESCE al posto di ISNULL. Dalle ricerche su Internet, ho scoperto che COALESCE è lo standard ANSI, quindi c'è un vantaggio che sappiamo cosa aspettarci quando lo utilizziamo. Tuttavia, ISNULL sembra più facile da leggere poiché sembra più chiaro cosa sta facendo.

Mi rendo anche conto che ISNULL è un po 'complicato poiché agisce in modo diverso su server di database diversi e in lingue diverse.

Tutto ciò, secondo me, si riduce a stile e standard. Dato che lo stile è soggettivo, c'è qualche motivo per usare COALESCE su ISNULL (o viceversa)? In particolare, c'è un vantaggio prestazionale dell'uno rispetto all'altro?


1
Non vedo menzionato in nessuna delle risposte che una sottoquery in una COALESCE viene valutata due volte.
Martin Smith,

4
"ISNULL sembra più facile da leggere poiché sembra più chiaro cosa sta facendo" - davvero? Trovo il nome non intuitivo: mi aspetto che restituisca un valore booleano che indica se un'espressione è stata risolta in null o sconosciuta. Il nome COALESCEè semplicemente non intuitivo;)
onedayquando il

Risposte:



40
  • ISNULL è specifico di Sybase / SQL Server
  • COALESCE è portatile

Poi

  • ISNULL accetta 2 argomenti
  • COALESCE accetta argomenti 1-n

Finalmente, e la parte divertente. Tipo di dati del risultato e lunghezza / precisione / scala

Quest'ultimo bit è il motivo per cui ISNULL viene solitamente utilizzato perché è più prevedibile (?) E COALESCE può aggiungere conversioni di tipi di dati non intenzionali: da dove proviene il bit "è più lento"

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

Tutti i tipi di dati sono uguali, non vedrai alcuna differenza pratica ...


22

Come ha sottolineato Mark, sarà difficile trovare differenze di prestazioni; Penso che altri fattori saranno più importanti. Per me, uso sempre COALESCE e la maggior parte di questo è già stata menzionata da te o Mark:

  • COALESCE è lo standard ANSI. È un'altra cosa di cui devo preoccuparmi se eseguirò il porting del mio codice. Per me personalmente questo non è così importante, perché so quanto raramente questi porti effettivamente accadano al di fuori del mondo di classe di Celko, ma per alcune persone questo è un vantaggio.
  • Contrariamente a quanto hai detto sulla leggibilità, trovo che possa essere più difficile leggere ISNULL soprattutto per gli utenti che provengono da altre lingue o piattaforme in cui ISNULL restituisce un valore booleano (che non esiste in SQL Server). Certo, COALESCE è più difficile da pronunciare, ma almeno non porta a ipotesi errate.
  • COALESCE è molto più flessibile, come posso dire COALESCE (a, b, c, d) mentre con ISNULL dovrei fare molti annidamenti per ottenere la stessa cosa.

Dovresti anche essere sicuro di essere a conoscenza di come viene gestita la precedenza del tipo di dati usando le due funzioni se lo stai usando con tipi di dati / precisioni differenti ecc.

Nota

C'è un'eccezione. Questi sono gestiti in modo diverso nelle versioni correnti di SQL Server:

SELECT COALESCE((SELECT some_aggregate_query),0); 

SELECT ISNULL((SELECT some_aggregate_query),0); 

La COALESCEvariante verrà effettivamente eseguita some_aggregate_querydue volte (una volta per verificare il valore e una volta per restituirlo quando diverso da zero), mentre ISNULLeseguirà la subquery solo una volta. Parlo di alcune altre differenze qui:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.