Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk: SQL Server 2022 (16.x) dan versi yang lebih baru
Azure SQL Database
Azure SQL Managed Instance
basis data SQL di Microsoft Fabric
Artikel ini menguraikan cara menggunakan petunjuk kueri dengan Query Store. Petunjuk Penyimpanan Kueri menyediakan metode yang mudah digunakan untuk membentuk rencana kueri tanpa mengubah kode aplikasi.
- Untuk informasi selengkapnya tentang mengonfigurasi dan mengelola dengan Penyimpanan Kueri, lihat Memantau performa dengan menggunakan Penyimpanan Kueri.
- Untuk informasi tentang menemukan informasi yang bisa ditindaklanjuti dan mengoptimalkan performa dengan Penyimpanan Kueri, lihat Mengoptimalkan performa dengan Penyimpanan Kueri.
- Untuk informasi tentang mengoperasikan Penyimpanan Kueri di Azure SQL Database, lihat Mengoperasikan Penyimpanan Kueri di Azure SQL Database.
Caution
Karena Pengoptimal Kueri SQL Server biasanya memilih rencana eksekusi terbaik untuk kueri, sebaiknya hanya menggunakan petunjuk sebagai upaya terakhir untuk pengembang dan administrator database berpengalaman. Untuk informasi selengkapnya, lihat petunjuk Kueri .
Tonton video ini untuk mendapatkan gambaran umum tentang Query Store hints.
Overview
Idealnya, Pengoptimal Kueri memilih rencana eksekusi optimal untuk kueri.
Jika paket optimal tidak dipilih, pengembang atau administrator database (DBA) mungkin ingin mengoptimalkan kondisi tertentu secara manual. Petunjuk kueri ditentukan melalui OPTION klausa dan dapat digunakan untuk memengaruhi perilaku eksekusi kueri. Meskipun petunjuk kueri membantu menyediakan solusi yang dilokalkan untuk berbagai masalah terkait performa, mereka memerlukan penulisan ulang teks kueri asli. Administrator dan pengembang database mungkin tidak selalu dapat membuat perubahan langsung ke kode Transact-SQL untuk menambahkan petunjuk kueri. Transact-SQL mungkin dikodekan secara permanen ke dalam aplikasi atau dibuat secara otomatis oleh aplikasi. Sebelumnya, pengembang mungkin harus mengandalkan panduan rencana, yang dapat rumit untuk digunakan.
Query Store hint menyelesaikan masalah ini dengan memungkinkan Anda menyisipkan petunjuk kueri ke dalam suatu kueri tanpa langsung mengubah teks Transact-SQL dari kueri tersebut. Untuk informasi tentang petunjuk kueri mana yang dapat diterapkan, lihat Petunjuk kueri yang didukung.
Kapan menggunakan petunjuk "Query Store"
Seperti namanya, fitur ini diperluas dan bergantung pada Query Store. Query Store memungkinkan pengambilan kueri, rencana eksekusi, dan statistik waktu eksekusi terkait. Query Store sangat menyederhanakan pengalaman pelanggan dalam penyetelan kinerja secara keseluruhan. SQL Server 2016 (13.x) pertama kali memperkenalkan Penyimpanan Kueri, dan sekarang diaktifkan secara default di SQL Server 2022 (16.x), Azure SQL Managed Instance, Azure SQL Database, dan database SQL di Microsoft Fabric.
Pertama, kueri dijalankan, kemudian direkam oleh Penyimpanan Kueri. Kemudian DBA membuat petunjuk Query Store untuk sebuah kueri. Setelah itu, kueri dijalankan menggunakan hint Query Store.
Contoh di mana petunjuk Query Store dapat membantu dengan masalah performa tingkat kueri:
- Kompilasi ulang kueri pada setiap eksekusi.
- Batasi ukuran peruntukan memori untuk operasi penyisipan massal.
- Batasi tingkat paralelisme maksimum saat memperbarui statistik.
- Gunakan gabungan Hash, bukan gabungan Nested Loops.
- Gunakan tingkat kompatibilitas 110 untuk kueri tertentu sambil menyimpan semua yang lain dalam database pada tingkat kompatibilitas 150.
- Nonaktifkan pengoptimalan tujuan baris untuk
SELECT TOPkueri.
Untuk menggunakan petunjuk Query Store:
Identifikasi Penyimpanan Kueri
query_iddari kueri yang ingin Anda ubah. Anda dapat melakukan ini dengan berbagai cara:- Menjalankan kueri pada catalog view Query Store (Transact-SQL).
- Menggunakan laporan Penyimpanan Kueri bawaan SQL Server Management Studio.
- Menggunakan portal Azure Query Performance Insight untuk Azure SQL Database.
Jalankan
sys.sp_query_store_set_hintsdenganquery_iddan string petunjuk kueri yang ingin Anda terapkan ke kueri. String ini dapat berisi satu atau beberapa petunjuk kueri. Untuk informasi selengkapnya, lihat sys.sp_query_store_set_hints.
Setelah dibuat, petunjuk Penyimpanan Kueri tetap ada dan bertahan pada pengaktifan ulang dan saat terjadi failover. Petunjuk Query Store mengesampingkan petunjuk pernyataan yang dikodekan secara permanen dan petunjuk panduan rencana yang ada.
Jika petunjuk kueri bertentangan dengan apa yang mungkin untuk pengoptimalan kueri, eksekusi kueri tidak diblokir dan petunjuk tidak diterapkan. Dalam kasus di mana petunjuk akan menyebabkan kueri gagal, petunjuk diabaikan, dan detail kegagalan terbaru dapat dilihat di sys.query_store_query_hints.
Sebelum Anda menggunakan Query Store hint
Pertimbangkan hal berikut sebelum Anda mulai menggunakan petunjuk Penyimpanan Kueri.
- Selesaikan pemeliharaan statistik dan pemeliharaan indeks (jika diperlukan) sebelum mengevaluasi kueri untuk kemungkinan petunjuk baru di Penyimpanan Kueri. Pemeliharaan statistik, dan dalam tingkat yang lebih kecil pemeliharaan indeks, dapat mengatasi masalah yang memerlukan petunjuk kueri jika tidak ada.
- Sebelum menggunakan petunjuk Penyimpanan Kueri, uji database aplikasi Anda pada tingkat kompatibilitas terbaru untuk melihat apakah itu menyelesaikan masalah yang memerlukan petunjuk kueri.
- Misalnya, pengoptimalan Parameter Sensitif Plan (PSP) diperkenalkan di SQL Server 2022 (16.x) di bawah tingkat kompatibilitas 160. Ini menggunakan beberapa paket aktif per kueri untuk mengatasi distribusi data nonuniform. Jika lingkungan Anda tidak dapat menggunakan tingkat kompatibilitas terbaru, Anda dapat menggunakan petunjuk Penyimpanan Kueri dengan petunjuk
RECOMPILEpada tingkat kompatibilitas mana pun yang mendukung.
- Misalnya, pengoptimalan Parameter Sensitif Plan (PSP) diperkenalkan di SQL Server 2022 (16.x) di bawah tingkat kompatibilitas 160. Ini menggunakan beberapa paket aktif per kueri untuk mengatasi distribusi data nonuniform. Jika lingkungan Anda tidak dapat menggunakan tingkat kompatibilitas terbaru, Anda dapat menggunakan petunjuk Penyimpanan Kueri dengan petunjuk
- Petunjuk Penyimpanan Kueri mengambil alih perilaku rencana kueri default Mesin Database. Anda sebaiknya hanya menggunakan petunjuk Query Store saat benar-benar diperlukan untuk mengatasi masalah terkait kinerja.
- Anda harus mengevaluasi kembali petunjuk Penyimpanan Kueri, petunjuk pada tingkat pernyataan, panduan rencana, dan rencana paksa Penyimpanan Kueri ketika ada perubahan volume dan distribusi data dan selama proyek migrasi database. Perubahan volume dan distribusi data dapat menyebabkan petunjuk penggunaan Query Store menghasilkan rencana eksekusi suboptimal.
Prosedur tersimpan sistem petunjuk Query Store
Untuk membuat atau memperbarui petunjuk, gunakan sys.sp_query_store_set_hints. Petunjuk ditentukan dalam format N'OPTION (...)'string yang valid.
- Saat Anda membuat petunjuk Penyimpanan Kueri, jika tidak ada petunjuk Penyimpanan Kueri untuk
query_idtertentu, petunjuk baru akan dibuat. - Saat Anda membuat atau memperbarui petunjuk Penyimpanan Kueri, jika petunjuk Penyimpanan Kueri sudah ada untuk
query_idtertentu, nilai terakhir yang disediakan mengambil alih nilai yang ditentukan sebelumnya untuk kueri terkait. - Jika
query_idtidak ada, kesalahan akan muncul.
Untuk daftar lengkap petunjuk yang didukung sebagai petunjuk Penyimpanan Kueri, lihat sys.sp_query_store_set_hints.
Untuk menghapus petunjuk yang terkait dengan query_id, gunakan sys.sp_query_store_clear_hints.
Tip
Anda mungkin perlu menyetel atau menghapus petunjuk untuk semua query_id nilai yang cocok dengan hash pencarian.
dbo.sp_query_store_modify_hints_by_query_hash adalah contoh prosedur tersimpan yang memanggil prosedur tersimpan sistem sys.sp_query_store_set_hints atau sys.sp_query_store_clear_hints dalam perulangan untuk mencapai hal ini.
Atribut Rencana Eksekusi XML
Saat petunjuk diterapkan, kumpulan hasil berikut muncul dalam StmtSimple elemen rencana Eksekusi dalam format XML:
| Attribute | Description |
|---|---|
QueryStoreStatementHintText |
Petunjuk Query Store Terkini diterapkan ke kueri |
QueryStoreStatementHintId |
Pengidentifikasi unik untuk petunjuk kueri |
QueryStoreStatementHintSource |
Sumber petunjuk Query Store (misalnya, User) |
Note
Elemen XML ini tersedia melalui output perintah Transact-SQL SET STATISTICS XML dan SET SHOWPLAN_XML.
Petunjuk Query Store dan interoperabilitas fitur
- Hint Penyimpanan Kueri menggantikan petunjuk tingkat pernyataan dan panduan rencana berkode keras lainnya.
- Kecuali untuk
ABORT_QUERY_EXECUTIONpetunjuk, kueri dengan petunjuk Penyimpanan Kueri selalu dijalankan. Petunjuk Query Store yang bertentangan diabaikan yang seharusnya menyebabkan kesalahan. - Jika petunjuk Query Store bertentangan, Mesin Basis Data tidak memblokir eksekusi kueri, dan petunjuk Query Store tidak diterapkan.
- Petunjuk Query Store tidak didukung untuk perintah yang memenuhi syarat untuk parameterisasi sederhana.
-
RECOMPILEPetunjuk (hint) tidak kompatibel dengan parameterisasi paksa yang ditetapkan di tingkat database. Jika database memiliki pengaturan parameterisasi paksa, dan penggunaanRECOMPILEadalah bagian dari petunjuk Query Store untuk sebuah kueri, Mesin Database mengabaikan petunjukRECOMPILEdan menerapkan petunjuk lain jika ada.- Mesin Database mengeluarkan peringatan (kode kesalahan 12461) yang menyatakan bahwa
RECOMPILEpetunjuk diabaikan. - Untuk informasi selengkapnya tentang pertimbangan kasus penggunaan parameterisasi paksa, lihat Panduan untuk Menggunakan Parameterisasi Paksa.
- Mesin Database mengeluarkan peringatan (kode kesalahan 12461) yang menyatakan bahwa
- Petunjuk Query Store yang dibuat secara manual dikecualikan dari pembersihan Query Store. Petunjuk dan kueri tidak dibersihkan oleh kebijakan pengambilan retensi otomatis.
- Kueri dapat dihapus secara manual oleh pengguna. Itu juga menghapus petunjuk Query Store.
- Petunjuk Penyimpanan Kueri yang dihasilkan secara otomatis oleh CE Feedback akan dibersihkan berdasarkan kebijakan retensi otomatis kebijakan penangkapan data.
- Umpan balik DOP dan umpan balik pemberian memori memengaruhi perilaku kueri tanpa menggunakan petunjuk Penyimpanan Kueri. Ketika kueri dibersihkan oleh kebijakan pengambilan retensi otomatis, umpan balik DOP dan data umpan balik pemberian memori juga dibersihkan.
- Jika Anda membuat petunjuk Query Store yang sama dengan umpan balik CE yang diterapkan secara manual, kueri dengan petunjuk tersebut tidak lagi akan dibersihkan oleh kebijakan penghapusan otomatis.
Petunjuk Query Store dan replika sekunder
Petunjuk untuk Query Store tidak berpengaruh pada replika sekunder kecuali Query Store untuk replika sekunder diaktifkan. Untuk informasi selengkapnya, lihat Query Store untuk sekunder yang dapat diakses.
- Di SQL Server 2022 (16.x) dan versi yang lebih lama, petunjuk Penyimpanan Kueri hanya dapat diterapkan pada replika utama.
- Di SQL Server 2025 (17.x) dan versi yang lebih baru, ketika Penyimpanan Kueri untuk replika sekunder diaktifkan, petunjuk Penyimpanan Kueri dapat diterapkan pada replika sekunder dalam grup ketersediaan. Untuk dukungan platform lengkap, lihat Query Store untuk sekunder terbacakan.
Di mana Penyimpanan Kueri didukung pada replika sekunder:
- Anda bisa menambahkan petunjuk Penyimpanan Kueri agar hanya berlaku pada grup replika tertentu saat Anda mengaktifkan Penyimpanan Kueri khusus untuk replika sekunder. Untuk melakukan ini, gunakan
@replica_group_idparameter saat memanggil sys.sp_query_store_set_query_hints. Sebaliknya, Anda dapat menghapus hint Query Store dari grup replika tertentu menggunakan sys.sp_query_store_clear_query_hints. - Temukan grup replika yang tersedia dengan mengkueri sys.query_store_replicas.
- Temukan rencana yang diterapkan secara paksa pada replika sekunder dengan sys.query_store_plan_forcing_locations.
Examples
A. Demo petunjuk Query Store
Panduan petunjuk berikut tentang penggunaan Query Store di Azure SQL Database menggunakan database yang diimpor melalui file berformat BACPAC (.bacpac). Pelajari cara mengimpor database baru ke server Azure SQL Database, lihat Mulai Cepat: Mengimpor file bacpac ke database di Azure SQL Database atau Azure SQL Managed Instance.
-- ************************************************************************ --
-- Query Store hints demo
-- Demo uses "PropertyMLS" database which can be imported from BACPAC here:
-- https://github.com/microsoft/sql-server-samples/tree/master/samples/features/query-store
-- Email QSHintsFeedback@microsoft.com for questions\feedback
-- ************************************************************************ --
/*
Demo prep, connect to the PropertyMLS database
*/
ALTER DATABASE [PropertyMLS] SET QUERY_STORE CLEAR;
ALTER DATABASE CURRENT SET QUERY_STORE = ON;
ALTER DATABASE CURRENT SET QUERY_STORE (QUERY_CAPTURE_MODE = ALL);
GO
-- Should be READ_WRITE
SELECT actual_state_desc
FROM sys.database_query_store_options;
GO
/*
You can verify Query Store Hints in sys.query_store_query_hints.
Checking if any already exist (should be none).
*/
SELECT query_hint_id,
query_id,
query_hint_text,
last_query_hint_failure_reason,
last_query_hint_failure_reason_desc,
query_hint_failure_count,
source,
source_desc
FROM sys.query_store_query_hints;
GO
/*
The PropertySearchByAgent stored procedure has a parameter
used to filter AgentId. Looking at the statistics for AgentId,
you will see that there is a big skew for AgentId 101.
*/
SELECT hist.range_high_key AS [AgentId],
hist.equal_rows
FROM sys.stats AS s
CROSS APPLY sys.dm_db_stats_histogram(s.[object_id], s.stats_id) AS hist
WHERE s.[name] = N'NCI_Property_AgentId';
-- Show actual query execution plan to see plan compiled.
-- Agent with many properties will have a scan with parallelism.
EXEC [dbo].[PropertySearchByAgent] 101;
-- Agents with few properties still re-use this plan (assuming no recent plan eviction).
EXEC [dbo].[PropertySearchByAgent] 4;
/*
Now let's find the query_id associated with this query.
*/
SELECT query_sql_text, q.query_id
FROM sys.query_store_query_text qt
INNER JOIN sys.query_store_query q ON
qt.query_text_id = q.query_text_id
WHERE query_sql_text like N'%ORDER BY ListingPrice DESC%' and query_sql_text not like N'%query_store%';
GO
/*
We can set the hint associated with the query_id returned in the previous result set, as below.
Note, we can designate one or more query hints
*/
EXEC sp_query_store_set_hints @query_id=5, @value = N'OPTION(RECOMPILE)';
GO
/*
You can verify Query Store Hints in sys.query_store_query_hints
*/
SELECT query_hint_id,
query_id,
query_hint_text,
last_query_hint_failure_reason,
last_query_hint_failure_reason_desc,
query_hint_failure_count,
source,
source_desc
FROM sys.query_store_query_hints;
GO
-- Execute both at the same time and show actual query execution plan.
-- You should see two different plans, one for AgentId 101 and one for AgentId 4.
EXEC [dbo].[PropertySearchByAgent] 101;
EXEC [dbo].[PropertySearchByAgent] 4;
GO
SELECT query_hint_id,
query_id,
query_hint_text,
last_query_hint_failure_reason,
last_query_hint_failure_reason_desc,
query_hint_failure_count,
source,
source_desc
FROM sys.query_store_query_hints;
GO
/*
We can remove the hint using sp_query_store_clear_query_hints
*/
EXEC sp_query_store_clear_hints @query_id = 10;
GO
/*
That Query Store Hint is now removed
*/
SELECT query_hint_id,
query_id,
query_hint_text,
last_query_hint_failure_reason,
last_query_hint_failure_reason_desc,
query_hint_failure_count,
source,
source_desc
FROM sys.query_store_query_hints;
GO
-- Execute both at the same time and show actual query execution plan.
-- You should see one plan again.
EXEC [dbo].[PropertySearchByAgent] 101;
EXEC [dbo].[PropertySearchByAgent] 4;
GO
B. Mengidentifikasi kueri di Query Store
Contoh berikut mengkueri sys.query_store_query_text dan sys.query_store_query untuk mengembalikan query_id fragmen teks kueri yang dijalankan.
Dalam demo ini, kueri yang kami coba sesuaikan ada dalam SalesLT database sampel:
SELECT * FROM SalesLT.Address as A
INNER JOIN SalesLT.CustomerAddress as CA
on A.AddressID = CA.AddressID
WHERE PostalCode = '98052' ORDER BY A.ModifiedDate DESC;
Query Store tidak segera mencerminkan data kueri pada tampilan sistemnya.
Identifikasi kueri dalam tampilan katalog sistem Penyimpanan Kueri:
SELECT q.query_id, qt.query_sql_text
FROM sys.query_store_query_text qt
INNER JOIN sys.query_store_query q ON
qt.query_text_id = q.query_text_id
WHERE query_sql_text like N'%PostalCode =%'
AND query_sql_text not like N'%query_store%';
GO
Dalam sampel berikut, contoh kueri sebelumnya dalam SalesLT database diidentifikasi sebagai query_id 39.
Setelah diidentifikasi, terapkan petunjuk untuk memberlakukan ukuran alokasi memori maksimum sebagai persentase dari batas memori yang dikonfigurasi ke query_id.
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(MAX_GRANT_PERCENT=10)';
Anda juga dapat menerapkan petunjuk kueri dengan sintaks berikut, misalnya opsi untuk memaksa penghitung kardinalitas legacy:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(USE HINT(''FORCE_LEGACY_CARDINALITY_ESTIMATION''))';
Anda bisa menerapkan beberapa petunjuk kueri dengan daftar yang dipisahkan koma:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(RECOMPILE, MAXDOP 1, USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_110''))';
Tinjau petunjuk Penyimpanan Kueri yang berlaku untuk query_id 39.
SELECT query_hint_id, query_id, query_hint_text, last_query_hint_failure_reason, last_query_hint_failure_reason_desc, query_hint_failure_count, source, source_desc
FROM sys.query_store_query_hints
WHERE query_id = 39;
Hapus petunjuk dari query_id 39 menggunakan sp_query_store_clear_hints sebagai langkah terakhir.
EXEC sys.sp_query_store_clear_hints @query_id = 39;
Konten terkait
- sys.query_store_query_hints (Transact-SQL)
- sys.sp_query_store_set_hints (T-SQL)
- sys.sp_query_store_clear_hints (Transact-SQL)
- Menyimpan Rencana Eksekusi dalam Format XML
- Menampilkan dan menyimpan rencana eksekusi
- Petunjuk kueri (Transact-SQL)
- Praktik terbaik untuk memantau beban kerja dengan Query Store
- Praktik terbaik untuk petunjuk Query Store
- Memantau performa dengan menggunakan Query Store
- Mengonfigurasi tingkat paralelisme maksimum (MAXDOP) dalam Azure SQL Database