2011-01-26 12 views
15

Ho una query sql che verrà riutilizzata in più stored procedure. La query funziona su più tabelle e restituisce un valore intero basato su 2 variabili passate a esso.riutilizzare sql con vista o funzione

Piuttosto che ripetere la query in diverse stored procedure voglio condividerla e hanno 2 opzioni:

  1. creare una visualizzazione a cui posso partecipare a in base alle variabili e ottenere il valore intero da esso.
  2. creare una funzione di nuovo con criteri passati ad esso e tornare variabile

sto appoggiato verso opzione 1 ma desidero opinioni su che è migliore e pratica comune intero. Quale sarebbe la migliore prestazione saggia, ecc (che unisce ad una vista o chiamando la funzione)

EDIT: Il RDBMS è SQL Server

risposta

13

Se si utilizzerà sempre lo stesso predicato parametrizzato per filtrare i risultati, sceglierei una funzione di tabella inline parametrizzata. In teoria, questo viene trattato come un View in quanto entrambi vengono espansi dall'ottimizzatore, in pratica può evitare problemi di predicate push. Un esempio di tale caso può essere visto nella seconda parte di this article.

Come fa notare Andomar nei commenti la maggior parte delle volte il Query Optimiser fa un buon lavoro di abbassare il predicato nel punto in cui è necessario, ma non sono a conoscenza di alcuna circostanza in cui l'utilizzo del TVF in linea eseguirà peggio quindi questa sembra una scelta predefinita razionale tra i due costrutti (molto simili).

L'unico vantaggio che posso vedere per la vista è che consente di selezionare senza filtro o con filtri diversi, quindi è più versatile.

I TVF in linea possono anche essere utilizzati per sostituire UDF scalari per guadagni di efficienza as in this example.

1

Non si può passare variabili in una vista, quindi l'unica opzione sembra è quello di utilizzare un funzione. Ci sono due opzioni per questo:

  • uno scalare funzione
  • una funzione con valori di tabella (in linea o multi-dichiarazione)

Se si stavano tornando record, allora si potrebbe utilizzare una clausola WHERE da fuori una VISTA non troppo complessa che può essere allineata nella query all'interno della vista, ma dal momento che tutto ciò che si sta restituendo è una singola colonna integer value, quindi una vista non funzionerà.

Un TVF inline può essere espanso da Query Optimizer per funzionare insieme alla query esterna (chiamata), quindi può essere più veloce nella maggior parte dei casi rispetto a una funzione SCALARE.

Tuttavia, gli usi sono diversi - una funzione scalare restituisce un singolo valore immediatamente

select dbo.scalarme(col1, col2), other from .. 

mentre un inline-TVF si richiede a uno sottoquery o CROSS APPLY contro un altro tavolo

select (select value from dbo.tvf(col1, col2)), other from .. 

-- or 

select f.value, t.other 
from tbl t 
CROSS apply dbo.tvf(col1, col2) f -- or outer apply 
+0

Una vista può restituire un risultato a riga singola a colonna singola. Non è un caso normale, ma è probabilmente ancora più efficiente delle UDF scalari. Modifica - Ah, stavi interrogando l'aspetto della parametrizzazione. Ho pensato che sarebbe stato un predicato sulla vista. –

+0

Posso aderire alla vista e limitare i risultati in base a una clausola where – amateur

+0

Normalmente si "passano" parametri in una vista con una clausola where – Andomar

0

Ho intenzione di darti una mezza risposta perché non posso essere sicuro di ciò che è meglio in termini di prestazioni, mi dispiace. Ma poi altre persone hanno sicuramente ricevuto buoni consigli su quel punteggio, ne sono certo.

Attaccherò alla parte della domanda "pratica comune".

Quindi, una funzione scalare del legno mi sembra una soluzione naturale in questo caso. Perché, vuoi solo un valore, un valore intero da restituire - questo è ciò per cui le funzioni scalari servono, no?

Ma poi, se potessi vedere una probabilità che più tardi avrei bisogno di più di un valore, potrei quindi considerare di passare a un TVF. Poi di nuovo, cosa succede se hai già implementato la tua funzione scalare e l'hai usata in molti punti della tua applicazione e ora hai bisogno di una riga, una colonna o una tabella di valori da restituire utilizzando fondamentalmente la stessa logica?

A mio avviso (nessun gioco di parole previsto), una vista potrebbe diventare qualcosa come il massimo comune divisore per le funzioni scalari e con valori di tabella. Le funzioni dovrebbero solo applicare i parametri.

Ora avete detto che state solo pensando di scegliere quale opzione usare. Tuttavia, considerando quanto sopra, continuo a pensare che le viste possano essere una buona scelta e si dimostrino utili quando ridimensionate la vostra applicazione, e potreste effettivamente utilizzare sia le viste che le funzioni (se solo ciò non ha turbato troppo le prestazioni) proprio come ho descritto.

0

Un vantaggio che TVF ha su una vista è che è possibile forzare chiunque lo chiami a targetizzare un indice specifico.

Problemi correlati