sys.dm_db_tuning_recommendations (T-SQL)
Berlaku untuk: SQL Server 2017 (14.x) dan azure SQL Database Azure SQL Managed Instance yang lebih baru
Mengembalikan informasi terperinci tentang rekomendasi penyetelan otomatis. Untuk informasi selengkapnya, lihat Penyetelan otomatis
Untuk informasi selengkapnya, lihat Pemantauan dan penyetelan performa di Azure SQL Database dan Azure SQL Managed Instance.
Di Azure SQL Database, tampilan manajemen dinamis tidak dapat mengekspos informasi yang akan memengaruhi penahanan database atau mengekspos informasi tentang database lain yang dapat diakses pengguna. Untuk menghindari mengekspos informasi ini, setiap baris yang berisi data yang bukan milik penyewa yang tersambung difilter.
Nama kolom | Jenis data | Keterangan |
---|---|---|
nama | nvarchar(4000) | Nama rekomendasi yang unik. |
jenis | nvarchar(4000) | Nama opsi penyetelan otomatis yang menghasilkan rekomendasi, misalnya, FORCE_LAST_GOOD_PLAN |
alasan | nvarchar(4000) | Alasan mengapa rekomendasi ini diberikan. |
valid_since | datetime2 | Pertama kali rekomendasi ini dibuat. |
last_refresh | datetime2 | Terakhir kali rekomendasi ini dihasilkan. |
state | nvarchar(4000) | Dokumen JSON yang menjelaskan status rekomendasi. Bidang berikut ini tersedia: - currentValue - status rekomendasi saat ini.- reason - konstanta yang menjelaskan mengapa rekomendasi berada dalam keadaan saat ini. |
is_executable_action | bit | 1 = Rekomendasi dapat dijalankan terhadap database melalui skrip Transact-SQL. 0 = Rekomendasi tidak dapat dijalankan terhadap database (misalnya: informasi saja atau rekomendasi yang dikembalikan) |
is_revertable_action | bit | 1 = Rekomendasi dapat dipantau dan dikembalikan secara otomatis oleh mesin Database. 0 = Rekomendasi tidak dapat dipantau dan dikembalikan secara otomatis. Sebagian besar tindakan yang dapat dieksekusi akan dapat dibalik. |
execute_action_start_time | datetime2 | Tanggal rekomendasi diterapkan. |
execute_action_duration | time | Durasi tindakan eksekusi. |
execute_action_initiated_by | nvarchar(4000) | User = Pengguna secara manual memaksa rencana dalam rekomendasi.System = Sistem secara otomatis menerapkan rekomendasi. |
execute_action_initiated_time | datetime2 | Tanggal rekomendasi diterapkan. |
revert_action_start_time | datetime2 | Tanggal rekomendasi dikembalikan. |
revert_action_duration | time | Durasi tindakan kembali. |
revert_action_initiated_by | nvarchar(4000) | User = Paket yang direkomendasikan pengguna yang tidak diberlakukan secara manual.System = Sistem secara otomatis mengembalikan rekomendasi. |
revert_action_initiated_time | datetime2 | Tanggal rekomendasi dikembalikan. |
skor | int | Estimasi nilai/efek untuk rekomendasi ini pada skala 0-100 (semakin besar semakin baik) |
Rincian | nvarchar(maks) | Dokumen JSON yang berisi detail selengkapnya tentang rekomendasi. Bidang berikut ini tersedia:planForceDetails - queryId - query_id kueri yang diregresi.- regressedPlanId - plan_id rencana kemunculan.- regressedPlanExecutionCount - Jumlah eksekusi kueri dengan rencana yang diregresi sebelum regresi terdeteksi.- regressedPlanAbortedCount - Jumlah kesalahan yang terdeteksi selama eksekusi rencana yang diregresi.- regressedPlanCpuTimeAverage - Waktu CPU rata-rata (dalam detik mikro) yang dikonsumsi oleh kueri yang diregresi sebelum regresi terdeteksi.- regressedPlanCpuTimeStddev - Simpangan baku waktu CPU yang dikonsumsi oleh kueri yang diregresi sebelum regresi terdeteksi.- recommendedPlanId - plan_id rencana yang harus dipaksakan.- recommendedPlanExecutionCount - Jumlah eksekusi kueri dengan rencana yang harus dipaksakan sebelum regresi terdeteksi.- recommendedPlanAbortedCount - Jumlah kesalahan yang terdeteksi selama eksekusi rencana yang harus dipaksakan.- recommendedPlanCpuTimeAverage - Waktu CPU rata-rata (dalam detik mikro) yang dikonsumsi oleh kueri yang dijalankan dengan rencana yang harus dipaksakan (dihitung sebelum regresi terdeteksi).- recommendedPlanCpuTimeStddev Simpangan baku waktu CPU yang dikonsumsi oleh kueri yang diregresi sebelum regresi terdeteksi.implementationDetails - method - Metode yang harus digunakan untuk memperbaiki regresi. Nilai selalu TSql .- script - Skrip Transact-SQL yang harus dijalankan untuk memaksa rencana yang direkomendasikan. |
Keterangan
Informasi yang dikembalikan oleh sys.dm_db_tuning_recommendations
diperbarui saat mesin database mengidentifikasi potensi regresi performa kueri, dan tidak bertahan. Rekomendasi disimpan hanya sampai mesin database dimulai ulang. sqlserver_start_time
Gunakan kolom di sys.dm_os_sys_info untuk menemukan waktu mulai mesin database terakhir. Administrator database harus secara berkala membuat salinan cadangan rekomendasi penyetelan jika mereka ingin menyimpannya setelah daur ulang server.
Bidang currentValue
dalam state
kolom mungkin memiliki nilai berikut:
Keadaan | Deskripsi |
---|---|
Active |
Rekomendasi aktif dan belum diterapkan. Pengguna dapat mengambil skrip rekomendasi dan menjalankannya secara manual. |
Verifying |
Rekomendasi diterapkan oleh Mesin Database dan proses verifikasi internal membandingkan performa rencana paksa dengan rencana yang mengalami kemunduran. |
Success |
Rekomendasi berhasil diterapkan. |
Reverted |
Rekomendasi dikembalikan karena tidak ada keuntungan performa yang signifikan. |
Expired |
Rekomendasi telah kedaluwarsa dan tidak dapat diterapkan lagi. |
Dokumen JSON dalam state
kolom berisi alasan yang menjelaskan mengapa rekomendasi dalam status saat ini. Nilai di bidang alasan mungkin:
Alasan | Deskripsi |
---|---|
SchemaChanged |
Rekomendasi kedaluwarsa karena skema tabel yang direferensikan diubah. Rekomendasi baru akan dibuat jika regresi rencana kueri baru terdeteksi pada skema baru. |
StatisticsChanged |
Rekomendasi kedaluwarsa karena perubahan statistik pada tabel yang direferensikan. Rekomendasi baru akan dibuat jika regresi rencana kueri baru terdeteksi berdasarkan statistik baru. |
ForcingFailed |
Paket yang direkomendasikan tidak dapat dipaksakan pada kueri. last_force_failure_reason Temukan dalam tampilan sys.query_store_plan untuk menemukan alasan kegagalan. |
AutomaticTuningOptionDisabled |
FORCE_LAST_GOOD_PLAN opsi dinonaktifkan oleh pengguna selama proses verifikasi. Aktifkan FORCE_LAST_GOOD_PLAN opsi menggunakan pernyataan ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL) atau paksa paket secara manual menggunakan skrip di details kolom. |
UnsupportedStatementType |
Paket tidak dapat dipaksakan pada kueri. Contoh kueri yang tidak didukung adalah kursor dan INSERT BULK pernyataan. |
LastGoodPlanForced |
Rekomendasi berhasil diterapkan. |
AutomaticTuningOptionNotEnabled |
Mesin Database mengidentifikasi potensi regresi performa, tetapi FORCE_LAST_GOOD_PLAN opsi tidak diaktifkan - lihat MENGUBAH DATABASE SET AUTOMATIC_TUNING (Transact-SQL). Terapkan rekomendasi secara manual atau aktifkan FORCE_LAST_GOOD_PLAN opsi. |
VerificationAborted |
Proses verifikasi dibatalkan karena mulai ulang atau pembersihan Penyimpanan Kueri. |
VerificationForcedQueryRecompile |
Kueri dikompresi ulang karena tidak ada peningkatan performa yang signifikan. |
PlanForcedByUser |
Pengguna secara manual memaksa paket menggunakan prosedur sp_query_store_force_plan (Transact-SQL). Mesin database tidak akan menerapkan rekomendasi jika pengguna secara eksplisit memutuskan untuk memaksa beberapa paket. |
PlanUnforcedByUser |
Pengguna secara manual membatalkan paket menggunakan prosedur sp_query_store_unforce_plan (Transact-SQL). Karena pengguna secara eksplisit mengembalikan paket yang direkomendasikan, mesin database akan tetap menggunakan paket saat ini dan menghasilkan rekomendasi baru jika beberapa regresi rencana terjadi di masa mendatang. |
UserForcedDifferentPlan |
Pengguna secara manual memaksa paket yang berbeda menggunakan prosedur sp_query_store_force_plan (Transact-SQL). Mesin database tidak akan menerapkan rekomendasi jika pengguna secara eksplisit memutuskan untuk memaksa beberapa paket. |
TempTableChanged |
Tabel sementara yang digunakan dalam paket diubah. |
Statistik di details
kolom tidak menampilkan statistik rencana runtime (misalnya, waktu CPU saat ini). Detail rekomendasi diambil pada saat deteksi regresi dan menjelaskan mengapa Mesin Database mengidentifikasi regresi performa. Gunakan regressedPlanId
dan recommendedPlanId
untuk mengkueri tampilan katalog Penyimpanan Kueri untuk menemukan statistik rencana runtime yang tepat.
Contoh penggunaan informasi rekomendasi penyetelan
Contoh 1
Kode sampel berikut mendapatkan skrip Transact-SQL yang dihasilkan yang memaksa rencana yang baik untuk kueri tertentu:
SELECT name,
reason,
score,
JSON_VALUE(details, '$.implementationDetails.script') AS script,
details.*
FROM sys.dm_db_tuning_recommendations
CROSS APPLY OPENJSON(details, '$.planForceDetails') WITH (
[query_id] INT '$.queryId',
regressed_plan_id INT '$.regressedPlanId',
last_good_plan_id INT '$.recommendedPlanId'
) AS details
WHERE JSON_VALUE(STATE, '$.currentValue') = 'Active';
Contoh 2
Berikut ini mendapatkan skrip Transact-SQL yang dihasilkan yang memaksa rencana yang baik untuk kueri tertentu dan informasi tambahan tentang perkiraan perolehan:
SELECT reason,
score,
script = JSON_VALUE(details, '$.implementationDetails.script'),
planForceDetails.*,
estimated_gain = (regressedPlanExecutionCount + recommendedPlanExecutionCount) * (regressedPlanCpuTimeAverage - recommendedPlanCpuTimeAverage) / 1000000,
error_prone = IIF(regressedPlanErrorCount > recommendedPlanErrorCount, 'YES', 'NO')
FROM sys.dm_db_tuning_recommendations
CROSS APPLY OPENJSON(Details, '$.planForceDetails') WITH (
[query_id] INT '$.queryId',
regressedPlanId INT '$.regressedPlanId',
recommendedPlanId INT '$.recommendedPlanId',
regressedPlanErrorCount INT,
recommendedPlanErrorCount INT,
regressedPlanExecutionCount INT,
regressedPlanCpuTimeAverage FLOAT,
recommendedPlanExecutionCount INT,
recommendedPlanCpuTimeAverage FLOAT
) AS planForceDetails;
Contoh 3
Berikut ini mendapatkan skrip Transact-SQL yang dihasilkan yang memaksa rencana yang baik untuk kueri tertentu dan informasi tambahan yang menyertakan teks kueri dan rencana kueri yang disimpan di Penyimpanan Kueri:
WITH cte_db_tuning_recommendations
AS (
SELECT reason,
score,
query_id,
regressedPlanId,
recommendedPlanId,
current_state = JSON_VALUE(STATE, '$.currentValue'),
current_state_reason = JSON_VALUE(STATE, '$.reason'),
script = JSON_VALUE(details, '$.implementationDetails.script'),
estimated_gain = (regressedPlanExecutionCount + recommendedPlanExecutionCount) *
(regressedPlanCpuTimeAverage - recommendedPlanCpuTimeAverage) / 1000000,
error_prone = IIF(regressedPlanErrorCount > recommendedPlanErrorCount, 'YES', 'NO')
FROM sys.dm_db_tuning_recommendations
CROSS APPLY OPENJSON(Details, '$.planForceDetails') WITH (
[query_id] INT '$.queryId',
regressedPlanId INT '$.regressedPlanId',
recommendedPlanId INT '$.recommendedPlanId',
regressedPlanErrorCount INT,
recommendedPlanErrorCount INT,
regressedPlanExecutionCount INT,
regressedPlanCpuTimeAverage FLOAT,
recommendedPlanExecutionCount INT,
recommendedPlanCpuTimeAverage FLOAT
)
)
SELECT qsq.query_id,
qsqt.query_sql_text,
dtr.*,
CAST(rp.query_plan AS XML) AS RegressedPlan,
CAST(sp.query_plan AS XML) AS SuggestedPlan
FROM cte_db_tuning_recommendations AS dtr
INNER JOIN sys.query_store_plan AS rp
ON rp.query_id = dtr.query_id
AND rp.plan_id = dtr.regressedPlanId
INNER JOIN sys.query_store_plan AS sp
ON sp.query_id = dtr.query_id
AND sp.plan_id = dtr.recommendedPlanId
INNER JOIN sys.query_store_query AS qsq
ON qsq.query_id = rp.query_id
INNER JOIN sys.query_store_query_text AS qsqt
ON qsqt.query_text_id = qsq.query_text_id;
Untuk informasi selengkapnya tentang fungsi JSON yang dapat digunakan untuk mengkueri nilai dalam tampilan rekomendasi, lihat Dukungan JSON di Mesin Database.
Izin
VIEW SERVER STATE
Memerlukan izin di SQL Server.
VIEW DATABASE STATE
Memerlukan izin untuk database di Azure SQL Database.
Izin untuk SQL Server 2022 dan yang lebih baru
VIEW SERVER PERFORMANCE STATE
Memerlukan izin pada server.