2014-07-23 16 views
11

È possibile creare un indice su una colonna in una tabella di funzioni con valori di tabella in SQL Server 2008?È possibile creare indici nella funzione di valori di tabella

La mia funzione sta ottenendo risultati lenti. Quando guardo il piano di esecuzione, era sotto la scansione della tabella, quindi ho bisogno di creare un indice sulla colonna della tabella delle funzioni in modo tale da mettere la clausola where.

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie in anticipo

+2

Normalmente, una funzione con valori di tabella restituisce solo le righe che sono necessari (quindi l'uso di una funzione * *). Ci sono probabilmente modi migliori per ottimizzare il tuo codice. –

+0

La funzione è sempre risultato lento, quindi la scansione di tabella potrebbe essere sulla tabella di origine della funzione, non nella tabella restituita output.So cercare di portare a vincoli di integrità e gli indici sulla tabella fisica – Recursive

+0

La vostra tabella di funzione con valori hanno più di 1 dichiarazione ? Se è così, è una funzione valutata a più tabelle. Questi possono e saranno molto peggiori persino di una funzione scalare. Le funzioni con valori di tabella devono essere allineate, il che significa una singola istruzione select. Pubblica il codice per la tua funzione e possiamo dare un'occhiata. –

risposta

12

Se la tabella di funzione con valori è di tipo inline si creerebbe l'indice sulle colonne della tabella sottostante.

Se si tratta di un TVF più istruzione in SQL Server 2008 (come etichettato) è possibile creare solo gli indici associati chiave primaria o vincoli univoci.

In SQL Server 2014+ it is possible to declare inline indexes not associated with any constraint.

Esempio

CREATE FUNCTION F() 
RETURNS @X TABLE 
(
A INT PRIMARY KEY /*<-- Implicit clustered index*/ 
) 
AS 
BEGIN 
INSERT INTO @X 
    VALUES(1),(2) 
RETURN; 
END 

GO 

SELECT * 
FROM F() 
WHERE A = 12 

enter image description here

Quanto sopra materializza l'intero gruppo di risultati in anticipo in una variabile di tabella prima, e crea un indice implicito su di esso.

TVFs Generalmente in linea sono da preferire a quelli multi-dichiarazione.

+1

Grazie. Ciò mi ha aiutato a ridurre i tempi di esecuzione su una query da 13 secondi a 1 secondo, anche se dovevo modificare la mia funzione in linea in una multiistruzione. – Gullbyrd

+0

Nel mio caso l'aggiunta dell'indice cluster al mio TVF ha aumentato solo il tempo di interrogazione di 1 secondo. –

Problemi correlati