sys.fn_validate_plan_guide (Transact-SQL)

Verifica la validità della guida di piano specificata. La funzione sys.fn_validate_plan_guide restituisce il primo messaggio di errore rilevato quando la guida di piano viene applicata alla query. Se la guida di piano è valida viene restituito un set di righe vuoto. Le guide di piano possono diventare non valide dopo aver apportato modifiche alla progettazione fisica del database. Ad esempio, se una guida di piano specifica un particolare indice che viene successivamente eliminato , la query non sarà più in grado di utilizzare la guida di piano.

Convalidando una guida di piano, è possibile determinare se la guida può essere utilizzata dall'ottimizzatore senza modifiche. In base ai risultati della funzione, è possibile decidere di eliminare la guida di piano e regolare la query oppure modificare la progettazione del database, ad esempio ricreando l'indice specificato nella guida di piano.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

sys.fn_validate_plan_guide ( plan_guide_id )

Argomenti

  • plan_guide_id
    ID della guida di piano come riportato nella vista del catalogo sys.plan_guides. plan_guide_id è di tipo int senza alcun valore predefinito.

Tabella restituita

Nome colonna

Tipo di dati

Descrizione

msgnum

int

ID del messaggio di errore.

severity

tinyint

Livello di gravità del messaggio, compreso tra 1 e 25.

state

smallint

Numero di contesto dell'errore indicante il punto nel codice in cui si è verificato l'errore.

message

nvarchar(2048)

Testo del messaggio di errore.

Autorizzazioni

Le guide di piano definite a livello di ambito di OBJECT richiedono l'autorizzazione VIEW DEFINITION o ALTER nell'oggetto a cui si fa riferimento e autorizzazioni per compilare la query o il batch forniti nella guida di piano. Ad esempio, se un batch contiene istruzioni SELECT, sono richieste autorizzazioni SELECT per gli oggetti a cui si fa riferimento.

Le guide di piano definite a livello di ambito di SQL o TEMPLATE richiedono l'autorizzazione ALTER per il database e autorizzazioni per compilare la query o il batch forniti nella guida di piano. Ad esempio, se un batch contiene istruzioni SELECT, sono richieste autorizzazioni SELECT per gli oggetti a cui si fa riferimento.

Esempi

A. Convalida di tutte le guide di piano in un database

Nell'esempio seguente viene verificata la validità di tutte le guide di piano nel database corrente. Se viene restituito un set di risultati vuoto, sono valide tutte le guide di piano.

USE AdventureWorks;
GO
SELECT plan_guide_id, msgnum, severity, state, message
FROM sys.plan_guides
CROSS APPLY fn_validate_plan_guide(plan_guide_id);
GO

B. Test della convalida della guida di piano prima di implementare una modifica nel database

Nell'esempio seguente viene utilizzata una transazione esplicita per eliminare un indice. Viene eseguita la funzione sys.fn_validate_plan_guide per determinare se l'azione invaliderà ogni guida di piano contenuta nel database. In base ai risultati della funzione, viene eseguito il commit dell'istruzione DROP INDEX o il rollback della transazione, l'indice non viene eliminato.

USE AdventureWorks;
GO
BEGIN TRANSACTION;
DROP INDEX IX_SalesOrderHeader_CustomerID ON Sales.SalesOrderHeader;
-- Check for invalid plan guides.
IF EXISTS (SELECT plan_guide_id, msgnum, severity, state, message
           FROM sys.plan_guides
           CROSS APPLY sys.fn_validate_plan_guide(plan_guide_id))
    ROLLBACK TRANSACTION;
ELSE
    COMMIT TRANSACTION;
GO