Bagikan melalui


Panduan Rencana

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceDatabase SQL di Microsoft Fabric

Important

Query Store hints menyediakan metode yang lebih mudah digunakan untuk mengatur rencana kueri tanpa mengubah kode aplikasi. Petunjuk Penyimpanan Kueri lebih sederhana daripada panduan rencana. Petunjuk Query Store tersedia di Azure SQL Database, SQL Database dalam Microsoft Fabric, Azure SQL Managed Instance, dan di SQL Server 2022 (16.x) dan versi yang lebih baru.

Panduan rencana memungkinkan Anda mengoptimalkan performa kueri saat Anda tidak dapat atau tidak ingin langsung mengubah teks kueri aktual di SQL Server. Panduan rencana memengaruhi pengoptimalan kueri dengan melampirkan petunjuk kueri atau rencana kueri tetap kepada mereka. Panduan rencana dapat berguna ketika subset kecil kueri dalam aplikasi database yang disediakan oleh vendor pihak ketiga tidak menampilkan performa seperti yang diharapkan. Dalam panduan paket, Anda menentukan pernyataan Transact-SQL yang ingin Anda optimalkan dan klausa OPTION yang berisi petunjuk kueri yang ingin Anda gunakan atau rencana kueri tertentu yang ingin Anda gunakan untuk mengoptimalkan kueri. Saat kueri dijalankan, SQL Server mencocokkan pernyataan Transact-SQL dengan panduan paket dan melampirkan klausul OPTION ke kueri pada waktu proses atau menggunakan rencana kueri yang ditentukan. Karena Pengoptimal Kueri SQL Server biasanya memilih rencana eksekusi terbaik untuk kueri, sebaiknya hanya menggunakan panduan paket sebagai upaya terakhir untuk pengembang dan administrator database yang berpengalaman.

Jumlah total panduan paket yang dapat Anda buat hanya dibatasi oleh sumber daya sistem yang tersedia. Namun demikian, panduan rencana harus terbatas pada kueri misi-kritis yang ditargetkan untuk meningkatkan atau menstabilkan performa. Panduan rencana tidak boleh digunakan untuk memengaruhi sebagian besar beban kueri aplikasi yang disebarkan.

Rencana eksekusi yang dihasilkan yang dipaksa oleh fitur ini akan sama atau mirip dengan rencana yang dipaksakan. Karena rencana yang dihasilkan mungkin tidak identik dengan rencana yang ditentukan oleh panduan rencana, performa rencana dapat bervariasi. Dalam kasus yang jarang terjadi, perbedaan performa mungkin signifikan dan negatif; dalam hal ini, administrator harus menghapus rencana paksa.

Panduan Rencana tidak dapat digunakan di setiap edisi Microsoft SQL Server. Untuk daftar fitur yang didukung oleh edisi SQL Server, lihat Fitur yang Didukung oleh Edisi SQL Server 2016. Panduan rencana terlihat dalam edisi apa pun. Anda juga dapat melampirkan database yang berisi panduan rencana ke edisi apa pun. Panduan jalur tetap tidak berubah saat Anda memulihkan atau melampirkan database ke versi SQL Server yang ditingkatkan.

Jenis Panduan Rencana

Jenis panduan rencana berikut dapat dibuat.

Panduan paket OBJECT

Panduan rencana OBJEK cocok dengan kueri yang dijalankan dalam konteks prosedur tersimpan Transact-SQL, fungsi skalar, fungsi bernilai tabel multi-pernyataan, dan pemicu DML yang ditentukan pengguna.

Misalkan prosedur tersimpan berikut, yang menggunakan parameter @Country_region, berada dalam aplikasi database yang dijalankan pada database AdventureWorks2025.

CREATE PROCEDURE Sales.GetSalesOrderByCountry (@Country_region nvarchar(60))  
AS  
BEGIN  
    SELECT *  
    FROM Sales.SalesOrderHeader AS h, Sales.Customer AS c,   
        Sales.SalesTerritory AS t  
    WHERE h.CustomerID = c.CustomerID  
        AND c.TerritoryID = t.TerritoryID  
        AND CountryRegionCode = @Country_region  
END;  

Asumsikan bahwa prosedur tersimpan ini telah dikompilasi dan dioptimalkan untuk @Country_region = N'AU' (Australia). Namun, karena relatif sedikit pesanan penjualan yang berasal dari Australia, performa menurun saat kueri dijalankan menggunakan nilai parameter negara/wilayah dengan lebih banyak pesanan penjualan. Karena sebagian besar pesanan penjualan berasal dari Amerika Serikat, rencana kueri yang dihasilkan untuk @Country_region = N'US' kemungkinan besar akan berkinerja lebih baik untuk semua nilai parameter @Country_region yang mungkin.

Anda dapat mengatasi masalah ini dengan mengubah prosedur tersimpan untuk menambahkan OPTIMIZE FOR petunjuk kueri ke kueri. Namun, karena prosedur tersimpan berada dalam aplikasi yang disebarkan, Anda tidak dapat langsung mengubah kode aplikasi. Sebagai gantinya, Anda dapat membuat panduan rencana berikut di dalam database AdventureWorks2025.

sp_create_plan_guide   
@name = N'Guide1',  
@stmt = N'SELECT *FROM Sales.SalesOrderHeader AS h,  
        Sales.Customer AS c,  
        Sales.SalesTerritory AS t  
        WHERE h.CustomerID = c.CustomerID   
            AND c.TerritoryID = t.TerritoryID  
            AND CountryRegionCode = @Country_region',  
@type = N'OBJECT',  
@module_or_batch = N'Sales.GetSalesOrderByCountry',  
@params = NULL,  
@hints = N'OPTION (OPTIMIZE FOR (@Country_region = N''US''))';  

Saat kueri yang ditentukan dalam sp_create_plan_guide pernyataan dijalankan, kueri dimodifikasi sebelum pengoptimalan untuk menyertakan OPTIMIZE FOR (@Country = N''US'') klausa.

Panduan rencana SQL

Panduan rencana SQL mengaitkan kueri yang dieksekusi dalam konteks pernyataan Transact-SQL berdiri sendiri dan batch yang bukan bagian dari objek basis data. Panduan rencana berbasis SQL juga dapat digunakan untuk mencocokkan kueri yang memparameterisasi ke dalam bentuk tertentu. Panduan rencana SQL berlaku untuk pernyataan dan batch Transact-SQL yang mandiri. Sering kali, pernyataan ini dikirimkan oleh aplikasi dengan menggunakan prosedur tersimpan sistem sp_executesql . Misalnya, pertimbangkan batch yang berdiri sendiri berikut:

SELECT TOP 1 * FROM Sales.SalesOrderHeader ORDER BY OrderDate DESC;  

Untuk mencegah rencana eksekusi paralel dihasilkan pada kueri ini, buat panduan rencana berikut dan tetapkan petunjuk kueri MAXDOP ke 1 pada parameter @hints.

sp_create_plan_guide   
@name = N'Guide2',   
@stmt = N'SELECT TOP 1 * FROM Sales.SalesOrderHeader ORDER BY OrderDate DESC',  
@type = N'SQL',  
@module_or_batch = NULL,   
@params = NULL,   
@hints = N'OPTION (MAXDOP 1)';  

Sebagai contoh lain, pertimbangkan pernyataan SQL berikut yang dikirimkan menggunakan sp_executesql.

exec sp_executesql N'SELECT * FROM Sales.SalesOrderHeader
where SalesOrderID =  @so_id', N'@so_id int', @so_id = 43662;  

Untuk membuat rencana unik untuk setiap eksekusi kueri ini, buat panduan rencana berikut dan gunakan petunjuk kueri OPTION (RECOMPILE) dalam parameter @hints.

exec sp_create_plan_guide   
@name = N'PlanGuide1_SalesOrders',   
@stmt = N'SELECT * FROM Sales.SalesOrderHeader
where SalesOrderID =  @so_id',
@type = N'SQL',  
@module_or_batch = NULL,   
@params = N'@so_id int',   
@hints = N'OPTION (recompile)';

Important

Nilai yang disediakan untuk argumen @module_or_batch dan @params dari pernyataan sp_create_plan guide harus cocok dengan teks yang sesuai yang diajukan dalam kueri aktual. Untuk informasi selengkapnya, lihat sp_create_plan_guide (Transact-SQL) dan Menggunakan SQL Server Profiler untuk Membuat dan Menguji Panduan Rencana.

Panduan rencana SQL juga dapat dibuat pada kueri yang memiliki parameterisasi ke bentuk yang sama ketika opsi database dengan parameterisasi diatur ke FORCED, atau ketika panduan rencana TEMPLATE dibuat untuk kelas kueri yang diparameterkan.

Panduan rencana TEMPLATE

Panduan rencana TEMPLAT sesuai dengan kueri mandiri yang diparameterkan ke dalam bentuk yang ditentukan. Panduan rencana ini digunakan untuk mengganti opsi PARAMETERISASI yang disetel dalam database untuk sekelompok kueri.

Anda dapat membuat panduan rencana TEMPLATE dalam salah satu situasi berikut:

  • Opsi database PARAMETERISASI DIATUR ke FORCED, tetapi ada kueri yang ingin Anda kompilasi sesuai dengan aturan Parameterisasi Sederhana.

  • Opsi database PARAMETERISASI DISETEL ke SIMPLE (pengaturan default), tetapi Anda ingin Parameterisasi Paksa dicoba pada kelas pernyataan kueri.

Persyaratan Keselarasan Panduan Rencana

Panduan rencana dibatasi pada database di mana panduan tersebut dibuat. Oleh karena itu, hanya panduan rencana yang ada di database saat kueri dijalankan dapat dicocokkan dengan kueri. Misalnya, jika AdventureWorks2025 adalah database saat ini dan kueri berikut dijalankan:

SELECT FirstName, LastName FROM Person.Person;

Hanya panduan rencana di database AdventureWorks2025 yang memenuhi syarat untuk dicocokkan dengan pertanyaan ini. Namun, jika AdventureWorks2025 adalah database saat ini dan pernyataan berikut dijalankan:

USE DB1; 
SELECT FirstName, LastName FROM Person.Person;

Hanya panduan rencana di DB1 yang dapat dicocokkan dengan kueri karena kueri dijalankan dalam konteks DB1.

Untuk panduan paket yang berbasis pada SQL atau TEMPLATE, SQL Server mencocokkan nilai untuk argumen @module_or_batch dan @params pada kueri dengan membandingkan dua nilai tersebut karakter demi karakter. Ini berarti Anda harus memberikan teks persis seperti SQL Server menerimanya dalam batch aktual.

Ketika @type = 'SQL' dan @module_or_batch diatur ke NULL, nilai @module_or_batch diatur ke nilai @stmt. Ini berarti bahwa nilai untuk statement_text harus disediakan dalam format yang identik, karakter-untuk-karakter, seperti yang dikirimkan ke SQL Server. Tidak ada konversi internal yang dilakukan untuk memfasilitasi kecocokan ini.

Ketika panduan paket reguler (SQL atau OBJECT) dan panduan paket TEMPLAT dapat berlaku untuk pernyataan, hanya panduan paket reguler yang akan digunakan.

Note

Batch yang berisi pernyataan yang ingin Anda gunakan untuk membuat panduan rencana tidak boleh mengandung pernyataan USEdatabase.

Efek Panduan Rencana pada Cache Rencana

Membuat panduan rencana pada modul akan menghapus rencana kueri untuk modul tersebut dari cache rencana. Membuat panduan rencana jenis OBJECT atau SQL dalam batch akan menghapus rencana kueri untuk batch yang memiliki nilai hash yang sama. Membuat panduan rencana jenis TEMPLATE akan menghapus semua batch pernyataan tunggal dari cache rencana dalam database tersebut.

Task Topic
Menjelaskan cara membuat panduan rencana. Buat Panduan Rencana Baru
Menjelaskan cara membuat panduan rencana untuk kueri parameter. Membuat Panduan Rencana untuk Kueri Berparameter
Menjelaskan cara mengontrol perilaku parameterisasi kueri dengan menggunakan panduan rencana. Tentukan Perilaku Parameterisasi Kueri dengan Menggunakan Panduan Rencana
Menjelaskan cara menyertakan rencana kueri tetap dalam panduan rencana. Menerapkan Rencana Kueri Tetap ke Panduan Paket
Menjelaskan cara menentukan pengarahan kueri dalam panduan rencana. Lampirkan Petunjuk Kueri ke Panduan Rencana
Menjelaskan cara melihat properti panduan perencanaan. Lihat Properti Panduan Rencana
Menjelaskan cara menggunakan SQL Server Profiler untuk membuat dan menguji panduan rencana. Menggunakan SQL Server Profiler untuk Membuat dan Menguji Panduan Rencana
Menjelaskan cara memvalidasi panduan rencana. Memvalidasi Panduan Rencana Setelah Peningkatan

Lihat Juga

sp_create_plan_guide (Transact-SQL)
sp_create_plan_guide_from_handle (Transact-SQL)
sp_control_plan_guide (Transact-SQL)
sys.plan_guides (Transact-SQL)
sys.fn_validate_plan_guide (Transact-SQL)