Domanda

Ho appena inserito una complessa istruzione SQL in una funzione con valori di tabella su SQL Server 2000. Quando guardo il piano di query per un SELECT * FROM dbo.NewFunc mi dà solo una scansione della tabella che ho creato.

Suppongo che ciò sia dovuto al fatto che la tabella è stata creata in tempdb e sto solo selezionando da essa.

Quindi la query è semplicemente:

SELECT * FROM table in tempdb

Le mie domande sono:

L'UDF utilizza lo stesso piano dell'istruzione SQL complessa?

Come posso ottimizzare gli indici per questo UDF?

Posso vedere il vero piano?

È stato utile?

Soluzione

Le funzioni con valori di tabella a più istruzioni (TVF) sono caselle nere per l'ottimizzatore per la query esterna. Puoi vedere solo IO, CPU ecc. Dal profiler.

TVF deve essere eseguito fino al completamento e restituire tutte le righe prima che si verifichi qualsiasi elaborazione. Ciò significa che una clausola where non sarà ottimizzata, ad esempio.

Quindi, se questo TVF restituisce un milione di righe, viene prima ordinato.

SELECT TOP 1 x FROM db.MyTVF ORDER BY x DESC

I TVF inline / single statement non soffrono perché vengono espansi come macro e valutati. L'esempio sopra dovrebbe valutare indici ecc.

Anche qui: Query Optimizer funziona bene con le funzioni con valori di tabella uniti / filtrati? e Efficienza relativa di JOIN vs APPLY in Microsoft SQL Server 2008

Per rispondere esattamente: no, no e no

Ho pochissimi TVF multiistruzione: dove faccio, ho molti parametri da filtrare all'interno dell'UDF.

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