Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik: Az SQL Server 2017 (14.x) és újabb verziói
az Azure SQL Database
Azure SQL Managed Instance
SQL Database-adatbázist a Microsoft Fabricben
Részletes információkat ad vissza az automatikus finomhangolási javaslatokról. További információ: Automatikus finomhangolás
További információ: Monitorozás és teljesítményhangolás az Azure SQL Database-ben és a felügyelt Azure SQL-példányban.
Az Azure SQL Database-ben a dinamikus felügyeleti nézetek nem tehetnek közzé olyan információkat, amelyek hatással lennének az adatbázis-elszigetelésre, vagy nem tehetnek közzé információkat más olyan adatbázisokról, amelyekhez a felhasználó hozzáfér. Az információk felfedésének elkerülése érdekében a rendszer kiszűr minden olyan sort, amely nem a csatlakoztatott bérlőhöz tartozó adatokat tartalmaz.
| Oszlop neve | Adattípus | Leírás |
|---|---|---|
| név | nvarchar(4000) | A javaslat egyedi neve. |
| type | nvarchar(4000) | A javaslatot tartalmazó automatikus hangolási lehetőség neve, például: FORCE_LAST_GOOD_PLAN |
| ok | nvarchar(4000) | A javaslat indoka. |
| valid_since | datetime2 | A javaslat első létrehozásakor. |
| last_refresh | datetime2 | A javaslat legutóbbi létrehozásakor. |
| state | nvarchar(4000) | A javaslat állapotát leíró JSON-dokumentum. A következő mezők érhetők el: - currentValue - a javaslat aktuális állapota.- reason - állandó, amely leírja, hogy a javaslat miért van a jelenlegi állapotban. |
| is_executable_action | bit | 1 = A javaslat Transact-SQL szkripttel végrehajtható az adatbázison. 0 = A javaslat nem hajtható végre az adatbázison (például: csak információk vagy a javaslat visszaállítása) |
| is_revertable_action | bit | 1 = Az adatbázismotor automatikusan monitorozza és visszaállítja a javaslatot. 0 = A javaslat nem figyelhető automatikusan, és nem állítható vissza. A legtöbb végrehajtható művelet visszaállítható lesz. |
| execute_action_start_time | datetime2 | A javaslat alkalmazásának dátuma. |
| execute_action_duration | time | A végrehajtási művelet időtartama. |
| execute_action_initiated_by | nvarchar(4000) |
User = Felhasználó manuálisan kényszerített terv a javaslatban.System = A rendszer automatikusan alkalmazza a javaslatot. |
| execute_action_initiated_time | datetime2 | A javaslat alkalmazásának dátuma. |
| revert_action_start_time | datetime2 | A javaslat visszaállításának dátuma. |
| revert_action_duration | time | A visszaállítási művelet időtartama. |
| revert_action_initiated_by | nvarchar(4000) |
User = Felhasználó által manuálisan ki nem kényszerített javasolt csomag.System = A rendszer automatikusan visszaállította a javaslatot. |
| revert_action_initiated_time | datetime2 | A javaslat visszaállításának dátuma. |
| pontszám | int | A javaslat becsült értéke/hatása a 0–100-ra (minél nagyobb, annál jobb) |
| Részletek | nvarchar(max) | JSON-dokumentum, amely további részleteket tartalmaz a javaslatról. A következő mezők érhetők el:planForceDetails- queryId - a regressziós lekérdezés query_id.- regressedPlanId - a regressziós terv plan_id.- regressedPlanExecutionCount - A regresszió észlelése előtt regressziós tervvel rendelkező lekérdezés végrehajtásának száma.- regressedPlanAbortedCount – A regressziós terv végrehajtása során észlelt hibák száma.- regressedPlanCpuTimeAverage - A regresszió észlelése előtt a regressziós lekérdezés által felhasznált átlagos processzoridő (mikro másodpercben).- regressedPlanCpuTimeStddev – A regresszió észlelése előtt a regressziós lekérdezés által felhasznált processzoridő szórása.- recommendedPlanId - plan_id a tervről, amelyet kényszeríteni kell.- recommendedPlanExecutionCount– A regresszió észlelése előtt kényszerített tervvel rendelkező lekérdezés végrehajtásának száma.- recommendedPlanAbortedCount - A kényszeríteni kívánt terv végrehajtása során észlelt hibák száma.- recommendedPlanCpuTimeAverage - A kényszerített tervvel végrehajtott lekérdezés által felhasznált átlagos cpu-idő (mikro másodpercben) (a regresszió észlelése előtt kiszámítva).- recommendedPlanCpuTimeStddev A regresszió észlelése előtt a regressziós lekérdezés által felhasznált processzoridő szórása.implementationDetails- method - A regresszió javításához használandó módszer. Az érték mindig TSql.- script - Transact-SQL szkriptet, amelyet az ajánlott terv kényszerítéséhez kell végrehajtani. |
Megjegyzések
Az adatbázismotor által sys.dm_db_tuning_recommendations visszaadott információk akkor frissülnek, ha az adatbázismotor azonosítja a lekérdezési teljesítmény regresszióját, és nem marad meg. A javaslatok csak az adatbázismotor újraindításáig maradnak meg. A sqlserver_start_time oszlopával keresse meg az adatbázismotor utolsó indítási idejét. Az adatbázis-rendszergazdáknak rendszeres időközönként biztonsági másolatot kell készíteniük a hangolási javaslatról, ha a kiszolgáló újrahasznosítása után meg szeretnék tartani.
Az currentValue oszlop mezője a state következő értékekkel rendelkezhet:
| Státusz | Description |
|---|---|
Active |
A javaslat aktív, és még nincs alkalmazva. A felhasználó átveheti a javaslatszkriptet, és manuálisan hajthatja végre. |
Verifying |
A javaslatot az adatbázismotor alkalmazza, és a belső ellenőrzési folyamat összehasonlítja a kényszerített terv teljesítményét a regressziós tervvel. |
Success |
A javaslat alkalmazása sikeresen megtörtént. |
Reverted |
A javaslat visszaáll, mert nincs jelentős teljesítménynövekedés. |
Expired |
A javaslat lejárt, és már nem alkalmazható. |
Az oszlopban található state JSON-dokumentum azt az okot tartalmazza, amely leírja, hogy miért van a javaslat az aktuális állapotban. Az ok mezőben a következő értékek lehetnek:
| Reason | Description |
|---|---|
SchemaChanged |
A javaslat lejárt, mert egy hivatkozott tábla sémája módosult. Új javaslat jön létre, ha új lekérdezési terv regresszióját észleli az új sémában. |
StatisticsChanged |
A javaslat egy hivatkozott tábla statisztikáinak változása miatt lejárt. Új javaslat jön létre, ha új statisztikai adatok alapján új lekérdezésterv-regressziót észlel. |
ForcingFailed |
Az ajánlott terv nem kényszeríthető lekérdezésre. Keresse meg a last_force_failure_reasonsys.query_store_plan nézetben a hiba okát. |
AutomaticTuningOptionDisabled |
FORCE_LAST_GOOD_PLAN beállítást a felhasználó letiltotta az ellenőrzési folyamat során. Engedélyezze a FORCE_LAST_GOOD_PLAN beállítást az ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL) utasítással, vagy kényszerítse manuálisan a tervet az details oszlopban lévő szkripttel. |
UnsupportedStatementType |
A terv nem kényszeríthető a lekérdezésre. A nem támogatott lekérdezések például a kurzorok és INSERT BULK az utasítás. |
LastGoodPlanForced |
A javaslat alkalmazása sikeresen megtörtént. |
AutomaticTuningOptionNotEnabled |
Az adatbázismotor potenciális teljesítményregressziót észlelt, de a FORCE_LAST_GOOD_PLAN beállítás nincs engedélyezve – lásd: ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL). Alkalmazza manuálisan a javaslatot, vagy engedélyezze a FORCE_LAST_GOOD_PLAN beállítást. |
VerificationAborted |
Az ellenőrzési folyamat megszakadt az újraindítás vagy a Lekérdezéstár törlése miatt. |
VerificationForcedQueryRecompile |
A lekérdezés újrafordításra kerül, mert nincs jelentős teljesítménybeli javulás. |
PlanForcedByUser |
A felhasználó manuálisan kényszerítette a tervet sp_query_store_force_plan (Transact-SQL) eljárással. Az adatbázismotor nem alkalmazza a javaslatot, ha a felhasználó kifejezetten úgy döntött, hogy kényszerít egy tervet. |
PlanUnforcedByUser |
A felhasználó manuálisan, sp_query_store_unforce_plan (Transact-SQL) eljárással oldotta fel a tervet. Mivel a felhasználó kifejezetten visszaállította az ajánlott tervet, az adatbázismotor továbbra is az aktuális tervet használja, és új javaslatot hoz létre, ha a jövőben valamilyen tervregresszió történik. |
UserForcedDifferentPlan |
A felhasználó manuálisan kényszerítette a különböző csomagokat sp_query_store_force_plan (Transact-SQL) eljárással. Az adatbázismotor nem alkalmazza a javaslatot, ha a felhasználó kifejezetten úgy döntött, hogy kényszerít egy tervet. |
TempTableChanged |
A tervben használt ideiglenes tábla módosul. |
Az oszlop statisztikái nem jelenítik meg a details futásidejű terv statisztikáit (például az aktuális CPU-időt). A javaslat részletei a regresszió észlelésekor jelennek meg, és ismertetik, hogy az adatbázismotor miért azonosította a teljesítményregressziót. A regressedPlanId használatával recommendedPlanId és lekérdezéseivel pontos futásidejű tervstatisztikákat kereshet.
Példák finomhangolási javaslatok információinak használatára
1. példa
Az alábbi mintakód lekéri a létrehozott Transact-SQL szkriptet, amely egy jó tervet kényszerít ki egy adott lekérdezéshez:
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';
2. példa
Az alábbiakban a létrehozott Transact-SQL szkriptet kapjuk meg, amely egy jó tervet kényszerít ki az adott lekérdezéshez, és további információkat a becsült nyereségről:
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;
3. példa
Az alábbiakban lekéri a létrehozott Transact-SQL szkriptet, amely egy jó tervet kényszerít ki minden adott lekérdezéshez, valamint további információkat, amelyek tartalmazzák a lekérdezés szövegét és a Lekérdezéstárban tárolt lekérdezésterveket:
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;
Az értékek ajánlási nézetben való lekérdezéséhez használható JSON-függvényekről további információt az adatbázismotor JSON-támogatása című témakörben talál.
Permissions
Engedélyre van szükség VIEW SERVER STATE az SQL Serverben.
VIEW DATABASE STATE Az Azure SQL Database-ben az adatbázis engedélyére van szükség.
Engedélyek az SQL Server 2022-hez és újabb verziókhoz
Engedélyre van szükség VIEW SERVER PERFORMANCE STATE a kiszolgálón.