Domanda

Ho una domanda piuttosto grande che è necessaria in diverse stored procedure, e mi piacerebbe spostare in un'UDF per rendere più facile da mantenere (Un punto di vista non funziona, questo prende in un mazzo di parametri) però tutti quelli che ho mai parlato mi ha detto che UDF sono incredibilmente lenti.

Mentre io non so che cosa fa esattamente li lento, io sono la volontà di indovinare che essi sono, ma visto che io non sto usando questo UDF all'interno di un join, ma invece di restituire una variabile di tabella, penso che non sarebbe poi così male.

Quindi credo che la domanda è, dovrei evitare le UDF a tutti i costi? Può puntare a chiunque di prove concrete affermando che sono più lenti?

È stato utile?

Soluzione

UDF scalari sono molto lenti, UDF in linea sono nelle macro realtà, come tali, sono molto veloci: Un paio di articoli:

Riutilizzare il codice con le UDF con valori di tabella

Molti UDF linea annidati sono molto veloci

Altri link sulla lentezza della UDF scalari:

modelli di prestazione di SQL Server di un'UDF con datetime parametri

Non tutti i UDF sono male per le prestazioni

Altri suggerimenti

come lei ha sottolineato che i risultati del (tavolo) UDF non si aggiungeranno a nulla allora non shoud essere alcun impatto sulle prestazioni.

Per cercare di spiegare un po 'su perché UDF possono essere percepiti come lento (infatti proprio usato in modo sbagliato) si consideri il seguente exmaple;

Abbiamo tabelle A e B. dire che abbiamo avuto un join come

SELEZIONARE     A.col1,     A.col2,     B.ColWhatever A PARTIRE DAL         UN ISCRIVITI ON B = A.aid b.fk_aid DOVE     B.someCol = @ param1 E A.anotherCol = @ param2

In questo caso, SQL Server farà meglio per restituire i risultati nel modo più performante si sa come. Un fattore importante in questo sta riducendo il disco legge. Così - userà le condizioni nel join e dove la clausola di valutare (si spera con un indice) il numero di righe per tornare

.

Ora - dice estraiamo una parte delle condizioni utilizzate per restirct la quantità di dati restituiti a una funzione definita dall'utente. Ora - Query Optimizer non può più tirare indietro l'importo minimo di righe dal disco, si può trattare solo con le condizioni che fornisce. In poche parole - un UDF tabella viene sempre valutato e i dati vengono restituiti prima di essere restituito al sproc principale, quindi, se ci sono stati alcuni altri criteri nei originale si uniscono che meno rigido potrebbe aver causato legge - questo verrà applicato solo ai dati dopo essere tirato nel sproc.

Quindi diciamo creiamo una funzione definita dall'utente per selezionare le righe dalla tabella B che corrispondono alla clausola dove. Se ci sono 100k righe nella tabella B e il 50% di essi soddisfano i criteri della clausola where - allora tutte queste righe verranno restituiti al sProc per il confronto con la tabella A. Ora, se solo il 10% di coloro che hanno partite in tabella A ora stiamo parlando solo il 5% della tabella B che vogliamo lavorare, ma abbiamo già tirato indietro il 50%, la maggioranza dei quali non vogliamo!

Se questo viene attraverso scuse senza senso come completi - fatemelo sapere

Potrebbe pubblicare il tuo codice? In generale, se si utilizza un UDF scalare nella clausola di selezione di una query, le dichiarazioni all'interno del UDF verrà eseguita una volta per ogni riga restituita dalla query. Sarebbe meglio per eseguire un join a una tabella valutata UDF, o trovare un modo per eseguire la logica all'interno della vostra UDF utilizzando un join nell'istruzione SQL principale.

C'è qualche motivo non si desidera utilizzare un stored procedure invece di un'UDF ?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top