it-swarm.it

Differenza prestazionale per COALESCE rispetto a ISNULL?

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?

51
Richard

COALESCE viene tradotto internamente in un'espressione CASE, ISNULL è una funzione interna del motore.

COALESCE è una funzione standard ANSI, ISNULL è T-SQL.

Le differenze di prestazioni possono e sorgono quando la scelta influenza il piano di esecuzione ma la differenza nella velocità della funzione grezza è minuscola .

28
  • 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 ...

42
gbn

Come ha sottolineato Mark, sarà difficile trovare differenze di prestazioni; Penso che altri fattori saranno più importanti. Per me, I sempre uso 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 può 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 variante COALESCE eseguirà effettivamente some_aggregate_query due volte (una volta per verificare il valore e una volta per restituirlo quando diverso da zero), mentre ISNULL eseguirà la query secondaria solo una volta. Parlo di alcune altre differenze qui:

24
Aaron Bertrand