Utilizzo di SQL Server Profiler per creare e testare guide di pianoUse SQL Server Profiler to Create and Test Plan Guides

Quando si crea una guida di piano è possibile usare SQL Server ProfilerSQL Server Profiler per acquisire il testo esatto della query da usare nell'argomento statement_text della stored procedure sp_create_plan_guide .When you are creating a plan guide, you can use SQL Server ProfilerSQL Server Profiler to capture the exact query text for use in the statement_text argument of the sp_create_plan_guide stored procedure. Questo garantisce che in fase di compilazione la guida di piano corrisponderà alla query.This helps make sure that the plan guide will be matched to the query at compile time. Dopo la creazione della guida di piano è possibile utilizzare ancora SQL Server ProfilerSQL Server Profiler per verificare che la guida di piano corrisponda effettivamente alla query.After the plan guide is created, SQL Server ProfilerSQL Server Profiler can also be used to test that the plan guide is, in fact, being matched to the query. È in genere consigliabile testare le guide di piano tramite SQL Server ProfilerSQL Server Profiler per verificarne la corrispondenza con la query.Generally, you should test plan guides by using SQL Server ProfilerSQL Server Profiler to verify that your query is being matched to your plan guide.

Acquisizione del testo di una query tramite SQL Server ProfilerCapturing Query Text by Using SQL Server Profiler

Se si esegue una query e se ne acquisisce il testo esattamente come è stato inviato a SQL ServerSQL Server tramite SQL Server ProfilerSQL Server Profiler, sarà possibile creare una guida di piano di tipo SQL o TEMPLATE che corrisponderà esattamente al testo della query.If you run a query and capture the text exactly as it was submitted to SQL ServerSQL Server by using SQL Server ProfilerSQL Server Profiler, you can create a plan guide of type SQL or TEMPLATE that will match the query text exactly. Questo garantisce che la guida di piano verrà utilizzata da Query Optimizer.This makes sure that the plan guide is used by the query optimizer.

Si consideri la query seguente, inviata da un'applicazione come batch autonomo:Consider the following query that is submitted by an application as a stand-alone batch:

SELECT COUNT(*) AS c  
FROM Sales.SalesOrderHeader AS h  
INNER JOIN Sales.SalesOrderDetail AS d  
  ON h.SalesOrderID = d.SalesOrderID  
WHERE h.OrderDate BETWEEN '20000101' and '20050101';  

Si supponga di voler eseguire la query tramite un'operazione di merge join, ma che SHOWPLAN indichi che la query non sta utilizzando un merge join.Suppose you want this query to execute using a merge join operation, but SHOWPLAN indicates that the query is not using a merge join. Non è possibile modificare la query direttamente nell'applicazione, pertanto è necessario creare una guida di piano per specificare che l'hint per la query MERGE JOIN venga accodato alla query in fase di compilazione.You cannot change the query directly in the application, so instead you create a plan guide to specify that the MERGE JOIN query hint be appended to the query at compile time.

Per acquisire il testo della query esattamente come viene ricevuto da SQL ServerSQL Server , eseguire la procedura seguente:To capture the text of the query exactly as SQL ServerSQL Server receives it, follow these steps:

  1. Avviare una traccia di SQL Server ProfilerSQL Server Profiler verificando che sia selezionato il tipo di evento SQL:BatchStarting .Start a SQL Server ProfilerSQL Server Profiler trace, making sure that the SQL:BatchStarting event type is selected.

  2. Eseguire la query dall'applicazione.Have the application run the query.

  3. Sospendere la traccia di SQL Server ProfilerSQL Server Profiler .Pause the SQL Server ProfilerSQL Server Profiler Trace.

  4. Fare clic sull'evento SQL:BatchStarting corrispondente alla query.Click the SQL:BatchStarting event that corresponds to the query.

  5. Fare clic con il pulsante destro del mouse e scegliere Estrai dati eventi.Right-click and select Extract Event Data.

    Importante

    Non tentare di copiare il testo del batch selezionandolo dal riquadro inferiore della finestra di traccia di SQL Profiler.Do not try to copy the batch text by selecting it from the lower pane of the Profiler trace window. In caso contrario, la guida di piano creata potrebbe non corrispondere al batch originale.This might cause the plan guide that you create to not match the original batch.

  6. Salvare i dati degli eventi in un file.Save the event data to a file. Si ottiene in tal modo il testo del batch.This is the batch text.

  7. Aprire il file del testo del batch nel Blocco note e copiare il testo.Open the batch text file in Notepad and copy the text to the copy and paste buffer.

  8. Creare la guida di piano e incollare il testo copiato tra le virgolette (") specificate per l'argomento @stmt .Create the plan guide and paste the copied text inside the quotation marks ('') specified for the @stmt argument. È necessario usare caratteri di escape per ogni virgoletta singola nell'argomento @stmt facendola precedere da un'altra virgoletta singola.You must escape any single quotation marks in the @stmt argument by preceding them with another single quotation mark. Fare attenzione a non aggiungere o rimuovere altri caratteri quando si inseriscono queste virgolette.Be careful not to add or remove any other characters when you insert these single quotation marks. Ad esempio, il valore letterale di data '20000101' deve essere delimitato come ''20000101''.For example, the date literal '20000101' must be delimited as ''20000101''.

    La guida di piano ottenuta è la seguente:Here is the plan guide:

EXEC sp_create_plan_guide   
    @name = N'MyGuide1',  
    @stmt = N'<paste the text copied from the batch text file here>',  
    @type = N'SQL',  
    @module_or_batch = NULL,  
    @params = NULL,  
    @hints = N'OPTION (MERGE JOIN)';  

Test della guida di piano tramite SQL Server ProfilerTesting Plan Guides by Using SQL Server Profiler

Per verificare la corrispondenza tra una guida di piano e una query, eseguire la procedura seguente:To verify that a plan guide is being matched to a query, follow these steps:

  1. Avviare una traccia di SQL Server ProfilerSQL Server Profiler verificando che sia selezionato il tipo di evento Showplan XML , disponibile nel nodo Performance .Start a SQL Server ProfilerSQL Server Profiler trace, making certain that the Showplan XML event type is selected (located under the Performance node).

  2. Eseguire la query dall'applicazione.Have the application run the query.

  3. Sospendere la traccia di SQL Server ProfilerSQL Server Profiler .Pause the SQL Server ProfilerSQL Server Profiler Trace.

  4. Trovare l'evento Showplan XML relativo alla query interessata.Find the Showplan XML event for the affected query.

    Nota

    L'evento Showplan XML for Query Compile non può essere usato.The Showplan XML for Query Compile event cannot be used. PlanGuideDB non esiste nell'evento in questione.PlanGuideDB does not exist in that event.

  5. Se la guida di piano è di tipo OBJECT o SQL, verificare che nell'evento Showplan XML siano contenuti gli attributi PlanGuideDB e PlanGuideName per la guida di piano che si prevedeva corrispondesse alla query.If the plan guide is of type OBJECT or SQL, verify that the Showplan XML event contains the PlanGuideDB and PlanGuideName attributes for the plan guide that you expected to match the query. In alternativa, se la guida di piano è di tipo TEMPLATE, verificare che l'evento Showplan XML contenga gli attributi TemplatePlanGuideDB e TemplatePlanGuideName per la guida di piano prevista.Or, in the case of a TEMPLATE plan guide, verify that the Showplan XML event contains the TemplatePlanGuideDB and TemplatePlanGuideName attributes for the expected plan guide. Se tali attributi sono presenti, la guida di piano funziona regolarmente.This verifies that the plan guide is working. Questi attributi sono contenuti nell'elemento <StmtSimple> del piano.These attributes are contained under the <StmtSimple> element of the plan.

Vedere ancheSee Also

sp_create_plan_guide (Transact-SQL)sp_create_plan_guide (Transact-SQL)