2012-01-19 1 views
10

Sto usando ISNULL nel server MS SQl 2008, dal momento che la mia tabella è troppo grande, se l'utilizzo di ISNULL potrebbe causare qualche cosa alle prestazioni ?.È presente un problema di prestazioni durante l'utilizzo di ISNULL() in SQL Server?

Grazie in anticipo

+4

Non puoi testare e vedere? –

+1

Dipende da molte cose, come sempre. Come lo usi, dove lo usi, quale sia la tua domanda. Ulteriori dettagli potrebbero aiutare. – Paddy

+0

@SergioTulentsev Sto lavorando a un progetto di miglioramento. Quindi abbiamo aggiunto alcuni nuovi colomns a tbls. Quello sarà Nullo. I dati disponibili per lo sviluppo sono pochi. Il database di produzione è molto grande. Non posso accedervi. – kbvishnu

risposta

8

Se avete bisogno di usarlo, quindi eventuali differenze tra ISNULL e alternative come COALESCE o CASE sono minuscoli. Non preoccuparti

Eventuali differenze derivano dal modo in cui vengono gestiti i tipi di dati. COALESCE/CASE può aggiungere conversioni implicite dei tipi di dati mentre ISNULL ha regole più semplici.

Modifica

ISNULL nella lista SELECT per sopprimere NULLS è banale. Il lavoro principale verrà svolto nell'elaborazione di righe e dati. Un ISNULL aggiuntivo non è misurabile: Non optimise prematurely

+0

puoi vedere i commenti – kbvishnu

+1

Come per un'altra risposta su questo post, la funzione ISNULL ha un profilo di prestazione significativamente diverso quando usato in SELECT contro quando usato in una clausola WHERE o JOIN. La mia esperienza conferma che questo è il caso. –

+0

@DavidAlpert Concordato. È facile fare un uso improprio di – gbn

9

Sì, è possibile. Per ottimizzatore è meglio riscrivere la query (se possibile) per formare

(Field = @x OR @x IS NULL) 

causa delle funzioni in taluni casi impedisce ottimizzatore utilizzare statistiche e talvolta costretto conversioni di tipo di dati impliciti

+0

e può scrivere i miei commenti – kbvishnu

+0

: - selezionare oldcol, isnull (newcol, 0) 'a' da tbl. Quindi qui sto usando ISNULL. Puoi spiegare un po 'in base alla tua domanda. grazie – kbvishnu

+2

Nel tuo caso l'effetto dell'uso di ISNULL è trascurabile –

0

Come è stato già accennato dipende su come e dove lo stai usando nella tua query. Potrebbe essere che potresti voler mostrare il modo in cui lo stai usando nella tua query.

Anche io ti consiglierei di andare oltre questo - What makes a SQL statement sargable?

35

ISNULL() nella clausola select ha un'influenza trascurabile sulle prestazioni. Nella clausola where, invece, può avere un impatto enorme sulle prestazioni, poiché impedisce all'ottimizzatore di utilizzare un indice su quella colonna.

where isnull(col1, 0) = 0 -- unable to use index, because every 
          -- row has to be evaluated 

where col1 = isnull(@myVar, 0) -- index will be used, since isnull(@myVar, 0) 
           -- returns the same static value for every row and 
           -- not every row has to be evaluated by the function. 

Così, quando si utilizza IsNull() in una clausola where, valutare se impedisce l'ottimizzazione delle query di utilizzando un indice. In tal caso, prendere in considerazione la creazione di una colonna calcolata con il risultato se isnull (col1, 0) e indicizzare la colonna calcolata e utilizzarla nella clausola where.

+0

Nota che queste due condizioni non danno gli stessi risultati. – Atario

1

Evitare di utilizzare isNull nella clausola where. Fare riferimento a This article.

+0

Ehi lì - questa domanda ha già una risposta accettata. Questa è una buona notizia, ma sarebbe meglio come commento :) – landons

+0

Non capisco quell'articolo. Sta già guardando la colonna nuda. Isnull (@someVar, 0) non dovrebbe essere costoso. Isnull (someColumn, 0) potrebbe essere costoso se questo non consente di utilizzare l'indice. –

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/18966014) – derloopkat

1

Sì, c'è un problema di prestazioni per quanto ne so, in SQL Server Studio 2012.

Il problema è piuttosto eclatante quando ho usato in combinazione con ISNULLOVER. Dopo aver ottimizzato (cioè mettendo ISNULL nella sottoquery che sto usando OVER on), il tempo di esecuzione è ridotto da (stimato) 25.2 ore a 102 secondi.

La mia ipotesi è ISNULL è OK quando si esegue su un'intera colonna (ad esempio, in un plain-ol 'SELECT). Ma quando lo esegui con OVER viene chiamato ogni volta di nuovo, trascinando così le prestazioni.

Non pronto per eseguire ulteriori analisi. Semplicemente mettendolo qui per riferimento degli altri.