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 2022 (16.x) és újabb verziói
az Azure SQL Database
Azure SQL Managed Instance
SQL-adatbázist a Microsoft Fabricben
Ez a cikk bemutatja, hogyan alkalmazhat lekérdezési tippeket a Lekérdezéstár használatával. A Lekérdezéstár-tippek egy könnyen használható módszert biztosítanak a lekérdezéstervek alakításához az alkalmazáskód módosítása nélkül.
- A lekérdezéstárral való konfigurálással és felügyelettel kapcsolatos további információkért lásd: Teljesítmény figyelése a Lekérdezéstár használatával.
- A végrehajtható információk felderítéséről és a lekérdezéstár teljesítményének finomhangolásáról további információt a Teljesítmény finomhangolása a Lekérdezéstárcímű témakörben talál.
- A lekérdezéstár Azure SQL Database-ben való működtetéséről további információt A lekérdezéstár üzemeltetése az Azure SQL Database-bencímű témakörben talál.
Caution
Mivel az SQL Server Lekérdezésoptimalizáló általában a legjobb végrehajtási tervet választja ki egy lekérdezéshez, javasoljuk, hogy csak tippeket használjon a tapasztalt fejlesztők és adatbázis-rendszergazdák számára. További információ: Lekérdezési tippek.
Tekintse meg ezt a videót a Lekérdezéstár tippjeinek áttekintéséhez:
Overview
Ideális esetben a Lekérdezésoptimalizáló kiválaszt egy optimális végrehajtási tervet egy lekérdezéshez.
Ha nincs kiválasztva optimális terv, előfordulhat, hogy egy fejlesztő vagy adatbázis-rendszergazda (DBA) manuálisan szeretne optimalizálni bizonyos feltételekhez. A lekérdezési tippek a OPTION záradékon keresztül vannak megadva, és a lekérdezések végrehajtási viselkedésének befolyásolására használhatók. Bár a lekérdezési tippek segítenek honosított megoldásokat nyújtani a különböző teljesítményproblémákra, az eredeti lekérdezési szöveg átírását igénylik. Előfordulhat, hogy az adatbázisgazdák és a fejlesztők nem mindig tudják közvetlenül módosítani Transact-SQL kódot, hogy lekérdezési tippet adjanak hozzá. Előfordulhat, hogy a Transact-SQL egy alkalmazásba kódolt, vagy az alkalmazás automatikusan generálja. Korábban előfordulhat, hogy a fejlesztőknek terv útmutatóira kell támaszkodniuk, amelyek használata összetett lehet.
A Lekérdezéstár tippjei úgy oldják meg ezt a problémát, hogy lehetővé teszi, hogy a lekérdezésbe beszúrjon egy lekérdezési tippet anélkül, hogy közvetlenül módosítaná a lekérdezést Transact-SQL szöveget. További információ arról, hogy mely lekérdezési tippek alkalmazhatók: Támogatott lekérdezési tippek.
Mikor érdemes lekérdezéstár-tippeket használni?
Ahogy a név is sugallja, ez a funkció kiterjeszti és függ a Lekérdezéstártól. A Lekérdezéstár lehetővé teszi a lekérdezések, végrehajtási tervek és a kapcsolódó futtatókörnyezeti statisztikák rögzítését. A Lekérdezéstár jelentősen leegyszerűsíti az ügyfélélmény általános teljesítményhangolását. Az SQL Server 2016 (13.x) először bevezette a Lekérdezéstárat, és most alapértelmezés szerint engedélyezve van az SQL Server 2022 -ben (16.x), a Felügyelt Azure SQL-példányban, az Azure SQL Database-ben és az SQL Database-ben a Microsoft Fabricben.
Először végrehajtja a lekérdezést, majd rögzíti a Lekérdezéstár. Ezután a DBA létrehoz egy lekérdezéstár-tippet egy lekérdezéshez. Ezt követően a lekérdezés a Lekérdezéstár tipp használatával lesz végrehajtva.
Példák arra, hogy a Lekérdezéstár tippjei segíthetnek a lekérdezési szintű teljesítményproblémákban:
- Minden végrehajtásnál fordítsa újra a lekérdezést.
- Állítsa be a memóriahozzájárulási méret felső határát a tömeges beszúrási művelethez.
- A statisztikák frissítésekor korlátozza a párhuzamosság maximális fokát.
- Hash illesztés használata beágyazott hurkok illesztése helyett.
- kompatibilitási szintet 110-es verziót használjon egy adott lekérdezéshez, miközben az adatbázis minden más elemét a 150-es kompatibilitási szinten tartja.
- A
SELECT TOPlekérdezés sorcél-optimalizálásának letiltása.
Lekérdezéstár-tippek használata:
Azonosítsa a módosítani kívánt lekérdezési utasítás lekérdezéstár
query_id. Ezt többféleképpen teheti meg:- A Lekérdezéstár katalógusnézeteinek lekérdezése (Transact-SQL).
- Az SQL Server Management Studio beépített Lekérdezéstár-jelentéseinek használata.
- Az Azure Portal Lekérdezési teljesítményelemzés használata az Azure SQL Database-hez.
Hajtsa végre a
sys.sp_query_store_set_hints-t aquery_idparaméterrel és a lekérdezési tipp sztringgel, amelyet a lekérdezésre kíván alkalmazni. Ez a sztring egy vagy több lekérdezési tippet tartalmazhat. A teljes információért lásd sys.sp_query_store_set_hints.
A létrehozást követően a Query Store tippek megőrződnek, és túlélik az újraindításokat és a feladatátvételeket. A Lekérdezéstárban található tippek felülírják a szigorúan kódolt utasításszintű tippeket és a meglévő tervutasítási tippeket.
Ha egy lekérdezési tipp ellentmond a lekérdezésoptimalizálás lehetséges lehetőségeinek, a lekérdezés végrehajtása nem lesz letiltva, és a rendszer nem alkalmazza a tippet. Azokban az esetekben, amikor egy tipp egy lekérdezés sikertelenségét okozná, a rendszer figyelmen kívül hagyja a tippet, és a legutóbbi hibaadatok megtekinthetők sys.query_store_query_hints.
Lekérdezéstár-tippek használata előtt
Mielőtt elkezdené használni a Lekérdezéstár tippeket, vegye figyelembe az alábbiakat.
- A lekérdezések kiértékelése előtt végezze el a statisztikák karbantartását és index karbantartását (ha szükséges), amikor új Query Store tippeket keres. A statisztikák karbantartása és kisebb mértékű indexkarbantartás megoldhatja azt a problémát, amely egyébként lekérdezési tippet igényel.
- A Lekérdezéstár-tippek használata előtt tesztelje az alkalmazásadatbázist a legújabb kompatibilitási szinten , és ellenőrizze, hogy ez megoldja-e a lekérdezési tippet igénylő problémát.
- A paraméterérzékeny terv (PSP) optimalizálása például az SQL Server 2022-ben (16.x) lett bevezetve a 160-es kompatibilitási szinten. Lekérdezésenként több aktív csomagot használ a nemuniformos adateloszlások kezelésére. Ha a környezet nem tudja használni a legújabb kompatibilitási szintet, a
RECOMPILEtippet használó Lekérdezéstár-tippek bármilyen támogatott kompatibilitási szinten használhatók.
- A paraméterérzékeny terv (PSP) optimalizálása például az SQL Server 2022-ben (16.x) lett bevezetve a 160-es kompatibilitási szinten. Lekérdezésenként több aktív csomagot használ a nemuniformos adateloszlások kezelésére. Ha a környezet nem tudja használni a legújabb kompatibilitási szintet, a
- A lekérdezéstár-tippek felülírják az adatbázismotor alapértelmezett lekérdezésterv-viselkedését. Csak akkor érdemes lekérdezéstár-tippeket használnia, ha a teljesítménnyel kapcsolatos problémák megoldásához szükséges.
- A lekérdezéstár-útmutatókat, az utasításszint-útmutatókat, a terv-irányelveket és a lekérdezéstár kényszerített terveit újra kell értékelnie minden alkalommal, amikor változik az adatok mennyisége és eloszlása, valamint adatbázis-áttelepítési projektek során. Az adatmennyiség és -elosztás változásai miatt a Lekérdezéstár-tippek nem optimális végrehajtási terveket hozhatnak létre.
A Lekérdezéstár tippeket ad a rendszer által tárolt eljárásokhoz
Tippek létrehozásához vagy frissítéséhez használja a sys.sp_query_store_set_hints. A tippek érvényes sztringformátumban vannak megadva N'OPTION (...)'.
- Lekérdezéstár-tipp létrehozásakor, ha egy adott
query_id-hez nincs lekérdezéstár-tipp, egy új Lekérdezéstár-tipp jön létre. - Amikor létrehoz vagy frissít egy Query Store javaslatot, ha már létezik egy Query Store javaslat egy adott
query_idszámára, az utoljára megadott érték felülírja a lekérdéshez tartozó korábbi értékeket. - Ha egy
query_idnem létezik, hibaüzenet jelenik meg.
A Query Store által támogatott tippek teljes listájáért lásd sys.sp_query_store_set_hints.
A query_idtársított utasítások eltávolításához használja a sys.sp_query_store_clear_hints.
Tip
Előfordulhat, hogy a lekérdezés kivonatának megfelelő összes query_id értékhez meg kell adnia vagy törölnie kell a tippeket.
dbo.sp_query_store_modify_hints_by_query_hash egy példa tárolt eljárás, amely egy ciklusban meghívja a sys.sp_query_store_set_hints vagy a sys.sp_query_store_clear_hints rendszer tárolt eljárásait, hogy ezt elérje.
Végrehajtási terv XML-attribútumai
Tippek alkalmazásakor a következő eredményhalmaz jelenik meg a StmtSimpleVégrehajtási terv elemében XML formátumban:
| Attribute | Description |
|---|---|
QueryStoreStatementHintText |
A lekérdezésre alkalmazott tényleges lekérdezéstár-tippek |
QueryStoreStatementHintId |
Lekérdezési tipp egyedi azonosítója |
QueryStoreStatementHintSource |
A Lekérdezéstár tipp forrása (például User) |
Note
Ezek az XML-elemek a SET STATISTICS XML és a SET SHOWPLAN_XML Transact-SQL parancs kimenetén keresztül érhetők el.
A Lekérdezéstár tippjei és a funkciók együttműködési képessége
- A Lekérdezéstár-tippek felülírják a többi rögzített utasításszintű tippet és a terv útmutatóit.
- Kivéve a
ABORT_QUERY_EXECUTIONjelzést, a lekérdezéstár-tippekkel ellátott lekérdezések mindig végrehajtódnak. Az ellentétes lekérdezéstár-tippek figyelmen kívül lesznek hagyva, ami egyébként hibát okozna. - Ha a Lekérdezéstár tippjei ellentmondanak, az adatbázismotor nem blokkolja a lekérdezések végrehajtását, és a lekérdezéstár-tipp nincs alkalmazva.
- A lekérdezéstár tippjei nem támogatottak az egyszerű paraméterezésre alkalmas utasítások esetében.
- A
RECOMPILEtipp nem kompatibilis az adatbázis szintjén beállított kényszerített paraméterezéssel. Ha egy adatbázis kényszerített paraméterezési készlettel rendelkezik, és aRECOMPILEtipp egy lekérdezés Lekérdezéstár-tippjeinek része, az adatbázismotor figyelmen kívül hagyja aRECOMPILEtippet, és minden más tippet alkalmaz, ha meg van adva.- Az adatbázismotor figyelmeztetést ad ki (hibakód: 12461), amely szerint a
RECOMPILEtipp figyelmen kívül lett hagyva. - A kényszerített paraméterezési használati esetekkel kapcsolatos további információkért tekintse meg a kényszerített paraméterezés használatának irányelveit.
- Az adatbázismotor figyelmeztetést ad ki (hibakód: 12461), amely szerint a
- A manuálisan létrehozott lekérdezéstár-tippek kivételt képeznek a Lekérdezéstár törlése alól. Az automatikus adatmegőrzési rögzítési szabályzat nem távolítja el a tippet és a lekérdezést.
- A felhasználók manuálisan is eltávolíthatják a lekérdezéseket. Ezzel eltávolítja a társított lekérdezéstár-tippet is.
- A CE-visszajelzési által automatikusan generált lekérdezéstár-javaslatok a rögzítési házirend automatikus megőrzése során törlésre kerülhetnek.
- DOP visszajelzés és memória visszajelzés befolyásolja a lekérdezési viselkedést a lekérdezéstár-tippek használata nélkül. Ha a lekérdezéseket az automatikus adatmegőrzési rögzítési szabályzat megtisztítja, a DOP-visszajelzés és a memória-visszacsatolási visszajelzési adatok is törlődnek.
- Ha ugyanazt a lekérdezéstár-tippet hozza létre, amelyet a CE-visszajelzés manuálisan implementált, a tippet tartalmazó lekérdezést az automatikus adatmegőrzési rögzítési szabályzat már nem törli.
Query Store megjelölések és másodlagos replikák
A lekérdezéstár-tippeknek nincs hatása a másodlagos replikákra, kivéve, ha a másodlagos replikák lekérdezéstára engedélyezve van. További információkért lásd a Lekérdezéstárat az olvasható másodtárakról.
- Az SQL Server 2022 (16.x) és korábbi verzióiban a lekérdezéstár-tippek csak az elsődleges replikára alkalmazhatók.
- Az SQL Server 2025 (17.x) és újabb verzióiban, amikor a lekérdezéstároló engedélyezve van a másodlagos replikákra, a lekérdezéstároló tippeket alkalmazhatja az elérhetőségi csoportok másodlagos replikáira. A teljes platformtámogatásért tekintse meg a Lekérdezéstárat az olvasható másodtárakért.
Ahol a Lekérdezéstár funkció a másodlagos adatbázismásolatokon támogatott.
- Olyan lekérdezéstár-tippet adhat hozzá, amely csak egy adott replikacsoportra érvényes, ha engedélyezve van a Másodlagos replikák lekérdezéstára. Ehhez az
@replica_group_idparamétert használja, amikor a sys.sp_query_store_set_query_hints hívást kezdeményezi. Ezzel szemben eltávolíthat egy lekérdezéstár-tippet egy adott replikacsoportból sys.sp_query_store_clear_query_hints használatával. - Keresse meg az elérhető replikacsoportokat a sys.query_store_replicas lekérdezésével.
- Kényszerített tervek keresése másodlagos replikákon a sys.query_store_plan_forcing_locationssegítségével.
Examples
A. A Query Store utasítások bemutatója
Az Azure SQL Database lekérdezéstár-tippjeinek alábbi útmutatója egy BACPAC-fájlon (.bacpac)keresztül importált adatbázist használ. Megtudhatja, hogyan importálhat új adatbázist egy Azure SQL Database-kiszolgálóra. A rövid útmutató: Bacpac-fájl importálása adatbázisba az Azure SQL Database-ben vagy a felügyelt Azure SQL-példányban.
-- ************************************************************************ --
-- 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. Lekérdezés azonosítása a Lekérdezéstárban
Az alábbi példa a sys.query_store_query_text és a sys.query_store_query lekérdezésével visszaadja a végrehajtott lekérdezési szövegrészletet query_id.
Ebben a bemutatóban a hangolni kívánt lekérdezés a SalesLT mintaadatbázisban található:
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;
A Lekérdezéstár nem tükrözi azonnal a rendszernézetek lekérdezési adatait.
A lekérdezés azonosítása a Lekérdezéstár rendszerkatalógus-nézeteiben:
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
Az alábbi mintákban a SalesLT adatbázis előző lekérdezési példáját query_id 39-ként azonosítottuk.
Miután azonosította, alkalmazza a tippet a maximális memóriakiadási méret kikényszerítéséhez a konfigurált memóriakorlát százalékában a query_id:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(MAX_GRANT_PERCENT=10)';
A lekérdezési útmutatókat a következő szintaxissal is alkalmazhatja, például az örökölt számosságbecslő használatára kényszerítéséhez.
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(USE HINT(''FORCE_LEGACY_CARDINALITY_ESTIMATION''))';
Több lekérdezési tippet is alkalmazhat vesszővel tagolt listával:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(RECOMPILE, MAXDOP 1, USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_110''))';
Tekintse át a 39-query_id lekérdezéstárra vonatkozó tippet:
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;
Végül távolítsa el az útmutatást a query_id 39-ből a sp_query_store_clear_hintshasználatával.
EXEC sys.sp_query_store_clear_hints @query_id = 39;
Kapcsolódó tartalom
- sys.query_store_query_hints (Transact-SQL)
- sys.sp_query_store_set_hints (Transact-SQL)
- sys.sp_query_store_clear_hints (Transact-SQL)
- Végrehajtási terv mentése XML formátumban
- Végrehajtási tervek megjelenítése és mentése
- Lekérdezési tippek (Transact-SQL)
- Legjobb gyakorlatok a számítási feladatok figyelésére a Lekérdezéstárral
- Lekérdezéstár javaslatok legjobb gyakorlata
- A teljesítmény figyelése a Lekérdezéstár használatával
- A párhuzamosság maximális fokának (MAXDOP) konfigurálása az Azure SQL Database-ben