Bagikan melalui


Membuat Panduan Rencana untuk Kueri Berparameter

Berlaku untuk: SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Panduan rencana TEMPLAT cocok dengan kueri mandiri yang berparameter ke bentuk tertentu.

Contoh berikut membuat pedoman rencana yang cocok dengan kueri apa pun yang memiliki bentuk tertentu, dan mengarahkan SQL Server untuk memaksa parameterisasi pada kueri tersebut. Dua kueri berikut secara sinaptis setara, tetapi hanya berbeda dalam nilai harfiah konstan mereka.

SELECT * FROM AdventureWorks2022.Sales.SalesOrderHeader AS h  
INNER JOIN AdventureWorks2022.Sales.SalesOrderDetail AS d   
    ON h.SalesOrderID = d.SalesOrderID  
WHERE h.SalesOrderID = 45639;  
  
SELECT * FROM AdventureWorks2022.Sales.SalesOrderHeader AS h  
INNER JOIN AdventureWorks2022.Sales.SalesOrderDetail AS d   
    ON h.SalesOrderID = d.SalesOrderID  
WHERE h.SalesOrderID = 45640;  

Berikut adalah panduan rencana tentang bentuk kueri yang diparameterkan:

EXEC sp_create_plan_guide   
    @name = N'TemplateGuide1',  
    @stmt = N'SELECT * FROM AdventureWorks2022.Sales.SalesOrderHeader AS h  
              INNER JOIN AdventureWorks2022.Sales.SalesOrderDetail AS d   
                  ON h.SalesOrderID = d.SalesOrderID  
              WHERE h.SalesOrderID = @0',  
    @type = N'TEMPLATE',  
    @module_or_batch = NULL,  
    @params = N'@0 int',  
    @hints = N'OPTION(PARAMETERIZATION FORCED)';  

Dalam contoh sebelumnya, nilai untuk @stmt parameter adalah bentuk kueri berparameter. Satu-satunya cara yang dapat diandalkan untuk mendapatkan nilai ini untuk digunakan dalam sp_create_plan_guide adalah dengan menggunakan prosedur tersimpan sistem sp_get_query_template . Skrip berikut dapat digunakan keduanya untuk mendapatkan kueri berparameter lalu membuat panduan rencana di atasnya.

DECLARE @stmt nvarchar(max);  
DECLARE @params nvarchar(max);  
EXEC sp_get_query_template   
    N'SELECT * FROM AdventureWorks2022.Sales.SalesOrderHeader AS h  
      INNER JOIN AdventureWorks2022.Sales.SalesOrderDetail AS d   
          ON h.SalesOrderID = d.SalesOrderID  
      WHERE h.SalesOrderID = 45639;',  
    @stmt OUTPUT,   
    @params OUTPUT  
EXEC sp_create_plan_guide N'TemplateGuide1',   
    @stmt,   
    N'TEMPLATE',   
    NULL,   
    @params,   
    N'OPTION(PARAMETERIZATION FORCED)';  

Penting

Nilai literal konstanta dalam parameter @stmt yang diteruskan ke sp_get_query_template dapat memengaruhi tipe data yang dipilih untuk parameter yang menggantikan literal tersebut. Ini akan memengaruhi pencocokan panduan rencana. Anda mungkin harus membuat lebih dari satu panduan rencana untuk menangani rentang nilai parameter yang berbeda.

Anda juga dapat menggunakan panduan paket TEMPLATE bersama dengan panduan paket SQL. Misalnya, Anda dapat membuat panduan rencana TEMPLAT untuk memastikan bahwa kelas kueri diparameterkan. Anda kemudian dapat membuat panduan rencana SQL pada bentuk terparameterisasi dari kueri tersebut.