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
A paraméterérzékeny terv (PSP) optimalizálása az intelligens lekérdezésfeldolgozó szolgáltatáscsalád része. Azt a forgatókönyvet kezeli, amikor egy paraméteres lekérdezés egyetlen gyorsítótárazott terve nem optimális az összes lehetséges bejövő paraméterértékhez. Ez a nem egységes adateloszlások esetében fordul elő. További információ: Paraméterérzékenység , paraméterek és végrehajtási terv újrafelhasználása.
A problémaforgatókönyv meglévő kerülő megoldásaiért lásd a következő forrást:
- Paraméterérzékeny problémák kivizsgálása és megoldása
- Paraméterek és végrehajtási terv újrafelhasználása
- Olyan lekérdezések, amelyek esetében paraméterérzékeny tervekkel (PSP) kapcsolatos problémák merülnek fel
A PSP-optimalizálás automatikusan engedélyezi, hogy egyetlen paraméterezett utasításhoz több aktív, gyorsítótárazott terv legyen. A gyorsítótárazott végrehajtási tervek az ügyfél által megadott futtatókörnyezeti paraméterérték(ek) alapján különböző adatméreteket fogadnak el.
A paraméterezés ismertetése
Az SQL Server adatbázismotorban a Transact-SQL (T-SQL) utasítások paramétereinek vagy paraméterjelölőinek használata növeli a relációs motor azon képességét, hogy az új T-SQL-utasítások egyezzenek a meglévő, korábban lefordított végrehajtási tervekkel, és előléptesse a terv újrahasználatát. További információ: Egyszerű paraméterezés.
Az SQL Server alapértelmezett egyszerű paraméterezési viselkedését úgy is felülbírálhatja, hogy megadja, hogy az adatbázis összes SELECT, INSERT, UPDATE és DELETE utasítása paraméterezett legyen, bizonyos korlátozások figyelembevételével. További információ: Kényszerített paraméterezés.
PSP-optimalizálás implementálása
A kezdeti összeállítás során az oszlopstatisztikai hisztogramok azonosítják a nem egységes eloszlásokat, és kiértékelik a legkockázatosabb paraméteres predikátumokat, az összes rendelkezésre álló predikátumból legfeljebb három. Más szóval, ha ugyanazon lekérdezésen belül több predikátum is megfelel a feltételeknek, a PSP optimalizálása az első háromat választja. A PSP szolgáltatás korlátozza a kiértékelt predikátumok számát, hogy elkerülje a tervgyorsítótár és a lekérdezéstár túlterhelését túl sok tervvel (ha a lekérdezéstár engedélyezve van).
A jogosult csomagok esetében a kezdeti fordítás egy diszpécsercsomagot hoz létre, amely tartalmazza a PSP optimalizálási logikáját, az úgynevezett diszpécserkifejezést. A diszpécserterv a számosságtartomány határértékeinek predikátumai alapján lekérdezi a variánsokat .
Terminology
Diszpécser kifejezés
Kiértékeli a predikátumok számosságát a futásidejű paraméterértékek alapján, és a végrehajtást különböző lekérdezési változatokhoz irányítja.
Diszpécser terv
Az eredeti lekérdezéshez az a terv van gyorsítótárazva, amely tartalmazza a diszpécserkifejezést. A diszpécsercsomag lényegében a funkció által kiválasztott predikátumok gyűjteménye, néhány további részlettel. Minden egyes kiválasztott predikátum esetében a diszpécsertervben szereplő részletek között szerepel néhány, mint például a magas és az alacsony határértékek. Ezeket az értékeket használják a paraméterértékek különböző kategóriákra vagy tartományokra osztására. A diszpécserterv tartalmazza a határértékek kiszámításához használt statisztikákat is.
Lekérdezésvariáns
A diszpécserterv a futtatási környezet paraméterértékei alapján értékeli ki a predikátumok számosságát, csoportosítja ezeket az értékeket, és különálló lekérdezéseket generál a fordításhoz és a végrehajtáshoz. Ezeket a gyermek lekérdezéseket lekérdezésvariánsoknak nevezzük. A lekérdezés variánsoknak saját terveik vannak a terv gyorsítótárban és a Lekérdezéstárban.
Predikátum számosságtartománya
Futásidőben a rendszer az egyes predikátumok számosságát a futtatókörnyezet paraméterértékei alapján értékeli ki. A kézbesítő a számosságértékeket három predikátum számosságtartományba gyűjti össze fordításkor. A PSP optimalizálási funkció például három olyan tartományt hozhat létre, amelyek alacsony, közepes és magas számosságtartományokat jelölnek, ahogyan az alábbi ábrán látható.
Más szóval, amikor egy paraméteres lekérdezést először lefordítanak, a PSP optimalizálási funkciója létrehoz egy rendszerhéjtervet, amelyet diszpécsertervnek neveznek. A diszpécserkifejezés logikája a paraméterek futásidejű értékei alapján lekérdezésvariánsokba gyűjti a lekérdezéseket. A tényleges végrehajtás kezdetekor a diszpécser két lépést hajt végre:
a diszpécser kiértékeli a diszpécserkifejezést az adott paraméterkészlethez a számosságtartomány kiszámításához.
a diszpécser társítja ezeket a tartományokat adott lekérdezési változatokhoz, összeállítja, majd végrehajtja a változatokat. A PSP optimalizálási funkciója több lekérdezésvariánssal rendelkezik, így több terv is elérhető egyetlen lekérdezéshez.
A számosságtartomány határai a küldési terv ShowPlan XML-fájljain belül láthatók:
<Dispatcher>
<ParameterSensitivePredicate LowBoundary="100" HighBoundary="1000000">
<StatisticsInfo Database="[PropertyMLS]" Schema="[dbo]" Table="[Property]" Statistics="[NCI_Property_AgentId]" ModificationCount="0" SamplingPercent="100" LastUpdate="2019-09-07T15:32:16.89" />
<Predicate>
<ScalarOperator ScalarString="[PropertyMLS].[dbo].[Property].[AgentId]=[@AgentId]">
<Compare CompareOp="EQ">
<ScalarOperator>
<Identifier>
<ColumnReference Database="[PropertyMLS]" Schema="[dbo]" Table="[Property]" Column="AgentId" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Column="@AgentId" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
</Predicate>
</ParameterSensitivePredicate>
</Dispatcher>
A rendszer hozzáfűz egy PSP-optimalizálási tippet egy lekérdezésvariáns ShowPlan XML-jében található SQL-utasításhoz. A tipp nem használható közvetlenül, és nem elemezhető, ha manuálisan adja hozzá. A tipp a következő elemeket tartalmazza:
option ( PLAN PER VALUE ( ObjectID = (int), QueryVariantID = (int), predicate_range ( [databaseName].[ schemaName]. [tableName]. [columnName] = @paramName, lowBoundaryValue, highBoundaryValue ) ) )
-
Az ObjectID a modulból (azaz tárolt eljárásból, függvényből, triggerből) származik, amelynek az aktuális utasítás része; azzal a feltételezéssel, hogy az utasítás egy modulból lett létrehozva. Ha az utasítás dinamikus vagy alkalmi SQL (azaz) eredménye,
sp_executesqlakkor az ObjectID elem egyenlő0. - A QueryVariantID nagyjából egyenértékű a PSP-optimalizálás által kiválasztott összes predikátum tartományainak kombinációjával. Ha például egy lekérdezés két PSP-re jogosult predikátummal rendelkezik, és mindegyik predikátum három tartományból áll, kilenc lekérdezésvariáns tartomány lesz 1–9-es számmal.
- predikátumtartomány a diszpécserkifejezésből generált predikált számosságtartomány-információ.
Egy lekérdezésvariáns ShowPlan XML-jában (a Dispatcher elemen belül):
<Batch>
<Statements>
<StmtSimple StatementText="SELECT PropertyId,
 AgentId,
 MLSLinkId,
 ListingPrice,
 ZipCode,
 Bedrooms,
 Bathrooms
FROM dbo.Property
WHERE AgentId = @AgentId
ORDER BY ListingPrice DESC option (PLAN PER VALUE(ObjectID = 613577224, QueryVariantID = 1, predicate_range([PropertyMLS].[dbo].[Property].[AgentId] = @AgentId, 100.0, 1000000.0)))" StatementId="1" StatementCompId="2" StatementType="SELECT" StatementSqlHandle="0x090085E4372DFC69BB9E7EBA421561DE8E1E0000000000000000000000000000000000000000000000000000" DatabaseContextSettingsId="1" ParentObjectId="0" StatementParameterizationType="1" RetrievedFromCache="false" StatementSubTreeCost="0.021738" StatementEstRows="3" SecurityPolicyApplied="false" StatementOptmLevel="FULL" QueryHash="0x476167A000F589CD" QueryPlanHash="0xDE982107B7C28AAE" StatementOptmEarlyAbortReason="GoodEnoughPlanFound" CardinalityEstimationModelVersion="160">
<StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false" />
<Dispatcher>
<ParameterSensitivePredicate LowBoundary="100" HighBoundary="1e+06">
<StatisticsInfo LastUpdate="2019-09-07T15:32:16.89" ModificationCount="0" SamplingPercent="100" Statistics="[NCI_Property_AgentId]" Table="[Property]" Schema="[dbo]" Database="[PropertyMLS]" />
<Predicate>
<ScalarOperator ScalarString="[PropertyMLS].[dbo].[Property].[AgentId]=[@AgentId]">
<Compare CompareOp="EQ">
<ScalarOperator>
<Identifier>
<ColumnReference Database="[PropertyMLS]" Schema="[dbo]" Table="[Property]" Column="AgentId" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Column="@AgentId" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
</Predicate>
</ParameterSensitivePredicate>
</Dispatcher>
</StmtSimple>
</Statements>
</Batch>
Remarks
Az SQL Server 2025 -től (17.x) és az adatbázis-kompatibilitás 170-től kezdve a PSP optimalizálása a következő négy fejlesztést tartalmazza:
- Az adatmanipulációs nyelv (DML) olyan utasításainak támogatása, mint a DELETE, az INSERT, a MERGE és az UPDATE.
- Bővített támogatás
tempdbesetében. - További megfontolandó szempontok olyan helyzetekben, ahol több jogosult predikátum is létezik ugyanazon a táblán.
- A
query_with_parameter_sensitivitykiterjesztett esemény módosításai, amelyek az érdekes_predikátum_számot, a max_frontosságot, a psp_optimalizálás_támogatást és a lekérdezéstípust tartalmazzák, az SQL Server 2025 (17.x) és az adatbázis-kompatibilitás 170 módosításai előtt történtek. Most azonban vegye fel a interesting_predicate_count, interesting_predicate_details, psp_optimization_supported és query_type mezőket. További információkért lásd a Bővített események szakaszt .
A PSP optimalizálási funkciója jelenleg csak egyenlőségi predikátumokkal működik.
A diszpécsertervek automatikusan újra összeállításra kerülnek, ha jelentős adatelosztási változások történnek. A lekérdezésvariáns tervek igény szerint egymástól függetlenül újrafordodnak, mint bármely más lekérdezésterv-típus esetén, az alapértelmezett újrafordítási események függvényében. Az újrafordításról további információt a Végrehajtási tervek újrafordítása című témakörben talál.
A sys.query_store_plan Lekérdezéstár rendszerkatalógus nézete megváltozott, hogy különbséget tegyen egy normál lefordított terv, egy diszpécsercsomag és egy lekérdezésvariáns csomag között. Az új Lekérdezéstár rendszerkatalógus nézete sys.query_store_query_variant az eredeti paraméteres lekérdezések (más néven szülő-lekérdezések), a diszpécsercsomagok és a gyermek lekérdezésvariánsok közötti szülő-gyermek kapcsolatokról tartalmaz információkat.
Ha több predikátum is szerepel ugyanahhoz a táblához, a PSP-optimalizálás kiválasztja azt a predikátumot, amely az alapul szolgáló statisztikai hisztogram alapján a legtöbb adateltérésnek felel meg. Ha például
SELECT * FROM table WHERE column1 = @predicate1 AND column2 = @predicate2mind a kettőcolumn1 = @predicate1column2 = @predicate2azonos táblából származik,table1a funkció csak a leginkább ferde predikátumot értékeli ki. Ha azonban a példa lekérdezés egy olyan operátort tartalmaz, mint például egyUNION, a PSP több predikátumot is kiértékel. Ha például egy lekérdezés jellemzői hasonlóakSELECT * FROM table WHERE column1 = @predicate UNION SELECT * FROM table WHERE column1 = @predicate, a PSP ebben az esetben legfeljebb két predikátumot választ ki, mivel a rendszer úgy kezeli ezt a forgatókönyvet, mintha két különböző tábla volna. Ugyanez a viselkedés figyelhető meg az olyan lekérdezések esetében is, amelyek önkiszolgálóan csatlakoznak a tábla aliasaihoz.Egy lekérdezésvariáns ShowPlan XML-fájlja az alábbi példához hasonlóan nézne ki, ahol mindkét kiválasztott predikátumhoz tartozó információ hozzá van adva a
PLAN PER VALUE PSP-hez kapcsolódó jelzőhöz.<Batch> <Statements> <StmtSimple StatementText="SELECT b.PropertyId, 
 AgentId, 
 MLSLinkId, 
 ListingPrice, 
 ZipCode, 
 Bedrooms, 
 Bathrooms 
FROM dbo.AgentProperty a join PropertyDetails b on a.PropertyId = b.PropertyId
WHERE AgentId = @AgentId and Property_id=@Property_id
UNION
 SELECT c.PropertyId, 
 AgentId, 
 MLSLinkId, 
 ListingPrice, 
 ZipCode, 
 Bedrooms, 
 Bathrooms 
FROM dbo.AgentProperty c join PropertyDetails d on c.PropertyId = d.PropertyId
WHERE AgentId = @AgentId and Property_id=@Property_id option (PLAN PER VALUE(ObjectID = 981578535, QueryVariantID = 9, predicate_range([PropertyMLS].[dbo].[AgentProperty].[AgentId] = @AgentId, 100.0, 1000000.0),predicate_range([PropertyMLS].[dbo].[AgentProperty].[AgentId] = @AgentId, 100.0, 1000000.0)))" StatementId="1" StatementCompId="2" StatementType="SELECT" StatementSqlHandle="0x090051FBCD918F8DFD60D324887356B422D90000000000000000000000000000000000000000000000000000" DatabaseContextSettingsId="2" ParentObjectId="0" StatementParameterizationType="1" RetrievedFromCache="false" StatementSubTreeCost="29.2419" StatementEstRows="211837" SecurityPolicyApplied="false" StatementOptmLevel="FULL" QueryHash="0x6D2A4E407085C01E" QueryPlanHash="0x72101C0A0DD861AB" CardinalityEstimationModelVersion="160" BatchModeOnRowStoreUsed="true"> <StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false" /> <Dispatcher> <ParameterSensitivePredicate LowBoundary="100" HighBoundary="1e+06"> <StatisticsInfo LastUpdate="2022-08-11T20:42:35.02" ModificationCount="0" SamplingPercent="100" Statistics="[NCI_AgentProperty_AgentId]" Table="[AgentProperty]" Schema="[dbo]" Database="[PropertyMLS]" /> <Predicate> <ScalarOperator ScalarString="[PropertyMLS].[dbo].[AgentProperty].[AgentId] as [a].[AgentId]=[@AgentId]"> <Compare CompareOp="EQ"> <ScalarOperator> <Identifier> <ColumnReference Database="[PropertyMLS]" Schema="[dbo]" Table="[AgentProperty]" Alias="[a]" Column="AgentId" /> </Identifier> </ScalarOperator> <ScalarOperator> <Identifier> <ColumnReference Column="@AgentId" /> </Identifier> </ScalarOperator> </Compare> </ScalarOperator> </Predicate> </ParameterSensitivePredicate> <ParameterSensitivePredicate LowBoundary="100" HighBoundary="1e+06"> <StatisticsInfo LastUpdate="2022-08-11T20:42:35.02" ModificationCount="0" SamplingPercent="100" Statistics="[NCI_AgentProperty_AgentId]" Table="[AgentProperty]" Schema="[dbo]" Database="[PropertyMLS]" /> <Predicate> <ScalarOperator ScalarString="[PropertyMLS].[dbo].[AgentProperty].[AgentId] as [c].[AgentId]=[@AgentId]"> <Compare CompareOp="EQ"> <ScalarOperator> <Identifier> <ColumnReference Database="[PropertyMLS]" Schema="[dbo]" Table="[AgentProperty]" Alias="[c]" Column="AgentId" /> </Identifier> </ScalarOperator> <ScalarOperator> <Identifier> <ColumnReference Column="@AgentId" /> </Identifier> </ScalarOperator> </Compare> </ScalarOperator> </Predicate> </ParameterSensitivePredicate> </Dispatcher> <QueryPlan CachedPlanSize="160" CompileTime="17" CompileCPU="17" CompileMemory="1856" QueryVariantID="9">A PSP optimalizálási funkció által használt jelenlegi ferdeségi küszöbértékeket az alábbi módszerek közül egy vagy több használatával befolyásolhatja:
Számosságbecslő (CE) nyomkövetési jelzői, például a 9481-es nyomkövetési jelző (globális, munkamenet vagy lekérdezési szint)
Adatbázis-hatókörű konfigurációs lehetőségek, amelyek megpróbálják csökkenteni a használt CE-modellt, vagy befolyásolják a CE-modell által a több predikátum függetlenségére vonatkozó feltételezéseket. Ez különösen akkor hasznos, ha a többoszlopos statisztikák nem léteznek, ami befolyásolja a PSP-optimalizálás azon képességét, hogy értékelje ezen predikátumok megfelelőségét.
További információért lásd a SQL Server 2014 Számosságbecslő használatával történő lekérdezéstervek optimalizálása című dokumentáció több predikátumra vonatkozó megnövekedett korrelációra vonatkozó feltételezés szakaszát. Az újabb CE-modell megpróbál némi korrelációt és kisebb függetlenséget feltételezni a predikátumok konjunkciójához és diszjunkciójához. Az örökölt CE-modell használata hatással lehet a predikátumok többoszlopos illesztés forgatókönyvben való kiválasztására. Ezt a műveletet csak bizonyos forgatókönyvek esetén érdemes megfontolni, és a legtöbb számítási feladathoz nem ajánlott az örökölt CE-modellt használni.
A PSP-optimalizálás jelenleg minden lekérdezésvariánst új előkészített utasításként fordít le és hajt végre, ami az egyik oka annak, hogy a lekérdezésvariánsok elveszítik a társításukat a szülőmodulokkal,
object_idha a diszpécsercsomag egy modulon alapult (azaz tárolt eljárás, eseményindító, függvény, nézet stb.). Előkészített utasításként aobject_idnem olyan, amelysys.objectsközvetlenül egy objektumra leképezhető, hanem lényegében a kötegszöveg belső kivonatán alapuló számított érték. További információkért tekintse meg a DMV-dokumentáció Visszaadott táblázat szakaszátsys.dm_exec_plan_attributes.A lekérdezésvariáns tervek a csomaggyorsítótár objektumtárolójában (
CACHESTORE_OBJCP), a diszpécsercsomagok pedig az SQL Plans gyorsítótártárolójában (CACHESTORE_SQLCP) vannak elhelyezve. A PSP szolgáltatás azonban aobject_idlekérdezésvariáns szülőjét az ObjectID attribútumban tárolja, amely része a PSP által a ShowPlan XML-hez hozzáadott PLAN PER VALUE tippnek, ha a szülő lekérdezés egy modul része, és nem dinamikus vagy alkalmi T-SQL. A gyorsítótárazott eljárások, függvények és triggerek összesített teljesítménystatisztikái továbbra is felhasználhatók a megfelelő célokra. A DMV-hezsys.dm_exec_query_statshasonló nézetekben található részletesebb végrehajtással kapcsolatos statisztikák továbbra is tartalmazzák a lekérdezésvariánsok adatait, a tábla lekérdezésvariánsai és objektumaiobject_idközöttisys.objectstársítás azonban jelenleg nem igazodik egymáshoz, anélkül, hogy a ShowPlan XML további feldolgozást kapna minden olyan lekérdezésvariánshoz, amelyben részletesebb futtatókörnyezeti statisztikákra van szükség. A lekérdezésvariánsok futásidejű és várakozási statisztikai adatai további ShowPlan XML-elemzési technikák nélkül kérhetők le a lekérdezéstárból, ha a Lekérdezéstár engedélyezve van.Mivel a PSP-lekérdezésvariánsok új előkészített utasításként vannak végrehajtva, a
object_idnem jelenik meg automatikusan a terv gyorsítótárához kapcsolódósys.dm_exec_*DMV-kben a ShowPlan XML feldarabolása és szövegminta-összehasonlító technikák alkalmazása nélkül (vagyis további XQuery feldolgozás). Jelenleg csak a PSP-optimalizálási diszpécsercsomagok bocsátják ki a megfelelő szülőobjektum-azonosítót. Aobject_ida Lekérdezéstáron belül van elérhető, mivel a Lekérdezéstár egy relációsabb modellt tesz lehetővé, mint amit a tervgyorsítótár hierarchiája biztosít. További információkért tekintse meg a Lekérdezéstár rendszerkatalógus nézetét sys.query_store_query_variant.
Considerations
A PSP-optimalizálás engedélyezéséhez engedélyezze a 160-es adatbázis-kompatibilitási szintet ahhoz az adatbázishoz, amelyhez a lekérdezés végrehajtásakor csatlakozik.
A PSP optimalizálási funkciójával kapcsolatos további információkért javasoljuk, hogy a Lekérdezéstár bekapcsolásával engedélyezve legyen a Lekérdezéstár integrációja. Az alábbi példa bekapcsolja a Lekérdezéstárat egy már létező
MyNewDatabasenevű adatbázisban.
ALTER DATABASE [MyNewDatabase]
SET QUERY_STORE = ON (
OPERATION_MODE = READ_WRITE,
QUERY_CAPTURE_MODE = AUTO
);
Note
Az SQL Server 2022 -től (16.x) kezdődően a Lekérdezéstár alapértelmezés szerint engedélyezve van az összes újonnan létrehozott adatbázishoz.
A PSP-optimalizálás adatbázisszinten való letiltásához használja az
ALTER DATABASE SCOPED CONFIGURATION SET PARAMETER_SENSITIVE_PLAN_OPTIMIZATION = OFFadatbázis-hatókörű konfigurációt.Ha le szeretné tiltani a PSP optimalizálását a lekérdezés szintjén, használja a lekérdezési
DISABLE_PARAMETER_SENSITIVE_PLANtippet.Ha a 4136-os nyomkövetési zászló, az adatbázis hatókörébe tartozó konfiguráció
PARAMETER_SNIFFING, vagy a lekérdezési tippetUSE HINT('DISABLE_PARAMETER_SNIFFING')letiltja a paraméter figyelését, a PSP optimalizálása le van tiltva a kapcsolódó számítási feladatok és végrehajtási környezetek esetében. További információ: Lekérdezési tippek és ALTER DATABASE SCOPED CONFIGURATION.A csomaggyorsítótárban tárolt kézbesítőnkénti egyedi csomagvariánsok száma a gyorsítótár-blobolás elkerülése érdekében korlátozott. A belső küszöbérték nincs dokumentálva. Mivel minden SQL-köteg több csomag létrehozására is képes, és minden lekérdezésvariáns-terv rendelkezik egy független bejegyzéssel a tervgyorsítótárban, az engedélyezett tervbejegyzések alapértelmezett maximális számát is elérheti. Ha a lekérdezésterv gyorsítótár kiürítési sebessége szembetűnően magas, vagy a
CACHESTORE_OBJCPCACHESTORE_SQLCPmérete túl nagy, érdemes lehet alkalmazni a 174-es nyomkövetési jelzőt.A lekérdezéstárban lévő lekérdezésekhez tárolt egyedi tervvariánsok számát a
max_plans_per_querykonfigurációs beállítás korlátozza. Mivel a lekérdezésvariánsok több csomaggal is rendelkezhetnek, lekérdezésenként összesen 200 csomag jelenhet meg a Lekérdezéstárban. Ez a szám tartalmazza a szülő lekérdezéshez tartozó összes kézbesítő lekérdezésvariáns-csomagjait. Fontolja meg amax_plans_per_queryLekérdezéstár konfigurációs beállítás növelését.- Egy példa arra, hogy az egyedi tervek száma hogyan lépheti túl az alapértelmezett lekérdezéstár-korlátot
max_plans_per_query, egy olyan forgatókönyv, amelyben a következő viselkedést tapasztaljuk. Tegyük fel, hogy 10-es lekérdezésazonosítóval rendelkezik, amely két diszpécsercsomaggal rendelkezik, és mindegyik diszpécsercsomag 20 lekérdezésvariánssal rendelkezik (összesen 40 lekérdezésvariánssal). A 10-es lekérdezésazonosítóhoz tartozó tervek teljes száma 40 terv, amelyek a lekérdezési változatokhoz és a két diszpécser tervhez kapcsolódnak. Az is lehetséges, hogy a szülő lekérdezés (lekérdezés azonosítója: 10) 5 normál (nem diszpécser) tervvel rendelkezhet. Ez 47 tervet készít (40 lekérdezési variánsból, 2 diszpécsertervből és 5, nem PSP-hez kapcsolódó tervből). Továbbá, ha minden lekérdezésvariáns átlagosan öt tervvel rendelkezik, ebben a forgatókönyvben több mint 200 terv lehet a Lekérdezés Tárban egy szülő lekérdezéshez. Ez attól is függ, hogy az adathalmazokban milyen mértékű adatskew fordul elő, amelyekre ez a példa szülőlekérdezés hivatkozhat.
- Egy példa arra, hogy az egyedi tervek száma hogyan lépheti túl az alapértelmezett lekérdezéstár-korlátot
Minden lekérdezésvariáns adott diszpécserre való leképezése esetén:
- A
query_plan_hashegyedi. Ez az oszlop elérhető más dinamikus felügyeleti nézetekben és katalógustáblákbansys.dm_exec_query_statsis. - A
plan_handleegyedi. Ez az oszlop elérhető más dinamikus felügyeleti nézetekbensys.dm_exec_query_statssys.dm_exec_sql_textsys.dm_exec_cached_plansés függvényekben, valamint katalógustáblákban. - Ez
query_hashmás változatokban, amelyek ugyanarra a diszpécserre mutatnak, gyakori, így meg lehet határozni az összesített erőforrás-használatot azoknál a lekérdezéseknél, amelyek csak a bemeneti paraméterértékekben különböznek. Ez az oszlop a ,sys.dm_exec_query_statsés más dinamikus felügyeleti nézetekben és katalógustáblákbansys.query_store_queryérhető el. - Ez
sql_handleazért egyedi, mert a fordítás során speciális PSP-optimalizálási azonosítókat ad hozzá a lekérdezés szövegéhez. Ez az oszlop elérhető más dinamikus felügyeleti nézetekbensys.dm_exec_query_statssys.dm_exec_sql_textsys.dm_exec_cached_plansés függvényekben, valamint katalógustáblákban. A lekérdezéstárban ugyanazok a handle információk érhetők el, mint alast_compile_batch_sql_handleoszlop asys.query_store_querykatalógustáblázatban. -
query_idegyedi a lekérdezéstárban. Ez az oszlop elérhető a lekérdezéstár katalógustábláibansys.query_store_queryés más lekérdezéstár-táblákban.
- A
Terv kényszerítése a Lekérdezéstárban
Ugyanazokat a sp_query_store_force_plan és sp_query_store_unforce_plan tárolt eljárásokat használja a diszpécser vagy a változó tervek üzemeltetésére.
Ha egy változat kényszerítve van, a szülő diszpécser nem lesz kényszerítve. Ha egy diszpécser kényszerítve van, csak az adott diszpécsertől származó változatok tekinthetők használatra jogosultnak:
- A más diszpécserektől korábban kényszerített változatok inaktívvá válnak, de megtartják a kényszerített állapotot, amíg a diszpécser újra nem kényszeríti őket
- A korábban ugyanazon diszpécserben inaktívvá vált kényszerített változatokat ismét kényszerítik.
Lekérdezéstár lekérdezési javaslat viselkedése
Ha lekérdezéstár-tippet ad hozzá egy lekérdezésvariánshoz (gyermek lekérdezéshez), a rendszer ugyanúgy alkalmazza a tippet, mint egy nem PSP-lekérdezést. A lekérdezésvariáns-tippek nagyobb elsőbbséget élveznek, ha a lekérdezéstár szülő lekérdezésére is alkalmaztak egy tippet.
Ha egy lekérdezéstár-tippet ad hozzá a szülő lekérdezéshez, és a gyermek lekérdezés (lekérdezésvariáns) nem rendelkezik meglévő lekérdezéstár-tippel, a gyermek lekérdezés (lekérdezésvariáns) örökli a szülő lekérdezéstől származó tippet.
Ha a lekérdezéstár lekérdezési tippje el van távolítva a szülő lekérdezésből, a gyermek lekérdezések (lekérdezésvariánsok) is eltávolítják a tippet.
Ha egy
RECOMPILEutasítás hozzá van adva a szülő lekérdezéshez, a rendszer olyan terveket generál, amelyek nem PSP-tartalmúak, miután a meglévő lekérdezésvariáns tervek el lettek távolítva a terv gyorsítótárából, mivel a PSP funkció nem működik azokat a lekérdezéseket, amelyekRECOMPILEutasítást tartalmaznak.A Lekérdezéstár tipperedményei a kiterjesztett események
query_store_hints_application_successésquery_store_hints_application_failedesemények használatával figyelhetők meg. A sys.query_store_query_hints tábla az alkalmazott lekérdezési tippre vonatkozó információkat tartalmazza. Ha a tippet csak szülő lekérdezésre alkalmazták, a rendszerkatalógus a szülő lekérdezés tippinformációit tartalmazza, a gyermek lekérdezésekre azonban nem, bár a gyermek lekérdezések öröklik a szülő lekérdezés tippjét.
A lekérdezési tippeket és a terv kényszerítési viselkedését tartalmazó PSP az alábbi táblázatban foglalható össze:
| Lekérdezésvariáns-tipp vagy terv | A szülőnek egy felhasználó által alkalmazott tippje van | A szülő visszajelzési javaslatot kapott | A szülő manuálisan kényszerített tervet használ | A szülő APC 1 kényszerített csomaggal rendelkezik |
|---|---|---|---|---|
| Tipp a felhasználón keresztül | Lekérdezési variáns javaslat | Lekérdezési variáns javaslat | Lekérdezési variáns javaslat | N/A |
| Tipp visszajelzésen keresztül | Lekérdezési variáns javaslat | Lekérdezési variáns javaslat | Lekérdezési variáns javaslat | N/A |
| Felhasználó által kényszerített terv | Lekérdezésvariáns kényszerített terv |
Lekérdezésvariáns kényszerített terv |
Lekérdezésvariáns kényszerített terv |
Lekérdezésvariáns kényszerített terv |
| Az APC által kényszerített terv | Lekérdezésvariáns kényszerített terv |
Lekérdezésvariáns kényszerített terv |
Lekérdezésvariáns kényszerített terv |
Lekérdezésvariáns kényszerített terv |
| Nincs tipp vagy kényszerített terv | A szülő felhasználó tippje | Nincs tipp | Nincs művelet | Nincs művelet |
1 Az automatikus finomhangolási funkció automatikus tervkorrekciós összetevője
Bővített események
parameter_sensitive_plan_optimization_skipped_reason: A paraméterérzékeny terv funkció kihagyásakor fordul elő. Az esemény segítségével figyelheti a PSP-optimalizálás kihagyásának okát.Az alábbi lekérdezés a PSP kihagyásának lehetséges okait mutatja be:
SELECT map_value FROM sys.dm_xe_map_values WHERE [name] = 'psp_skipped_reason_enum' ORDER BY map_key;parameter_sensitive_plan_optimization: Akkor fordul elő, ha egy lekérdezés PSP-optimalizálási funkciót használ. Csak hibakeresési csatorna. Egyes érdeklődési területek a következőek lehetnek:- is_query_variant: azt írja le, hogy ez egy diszpécsercsomag (szülő) vagy lekérdezésvariáns csomag (gyermek)
- predicate_count: A PSP által kiválasztott predikátumok száma
- query_variant_id: megjeleníti a lekérdezésvariáns azonosítóját. A 0 érték azt jelenti, hogy az objektum egy diszpécserterv (szülő).
query_with_parameter_sensitivity: Az aktivált esemény megjeleníti azoknak a predikátumoknak a számát, amelyeket a funkció érdekesnek talált, további részletek json formátumban az érdekes predikátumokról, valamint arról, hogy a PSPO támogatott-e a predikátumhoz vagy predikátumokhoz.Példakimenet a
query_with_parameter_sensitivitykiterjesztett eseményből
| Field | Value |
|---|---|
| interesting_predicate_count | 3 |
| interesting_predicate_details | {"Predicates":[{"ColumnId":7,"TableId":1221579390,"Skewness":475038.75},{"ColumnId":7,"TableId":1221579390,"Skewness":475038.75},{"ColumnId":7,"TableId":1221579390,"Skewness":475038.75}]} |
| psp_optimization_supported | True |
| query_type | 195 |
SQL Server auditálási viselkedése
A PSP-optimalizálás audit adatokat biztosít a diszpécser tervutasításhoz, valamint a diszpécserhez társított lekérdezésvariánsokhoz. Az additional_information SQL Server Audit oszlopa a lekérdezési változatok megfelelő T-SQL-veremadatait is szolgáltatja. Ha az MyNewDatabase adatbázist példaként használjuk, és ennek az adatbázisnak van egy T2 nevű táblája, valamint egy usp_test nevű tárolt eljárása, a usp_test tárolt eljárás végrehajtása után a napló a következő bejegyzéseket tartalmazhatja:
| action_id | object_name | kimutatás | additional_information |
|---|---|---|---|
| AUSC | <action_info xmlns="http://schemas.microsoft.com/sqlserver/2008/sqlaudit_data"><session><![CDATA[Audit_Testing_Psp$A]]></session><action>event enabled</action><startup_type>manual</startup_type><object><![CDATA[audit_event]]></object></action_info> |
||
| EX | usp_test | exec usp_test 300 | |
| SL | T2 | válassza ki * a dbo.t2-ből ahol ID=@id | <tsql_stack><frame nest_level = '1' database_name = 'MyNewDatabase' schema_name = 'dbo' object_name = 'usp_test'/></tsql_stack> |
| SL | T2 | select * from dbo.t2 where ID=@id option (PLAN PER VALUE(ObjectID = 933578364, QueryVariantID = 1, predicate_range([MyNewDatabase].[dbo].[T2].[ID] = @id, 100,0, 100000,0))) | tsql_stack><frame nest_level = '1' database_name = 'MyNewDatabase' schema_name = 'dbo' object_name = 'usp_test'/></tsql_stack> |
| EX | usp_test | exec usp_test 60000 | |
| SL | T2 | válassza ki * a dbo.t2-ből ahol ID=@id | <tsql_stack><frame nest_level = '1' database_name = 'MyNewDatabase' schema_name = 'dbo' object_name = 'usp_test'/></tsql_stack> |
| SL | T2 | select * from dbo.t2 where ID=@id option (PLAN PER VALUE(ObjectID = 933578364, QueryVariantID = 3, predicate_range([TestDB_FOR_PSP].[ dbo]. [T2]. [ID] = @id, 100,0, 100000,0))) | <tsql_stack><frame nest_level = '1' database_name = 'MyNewDatabase' schema_name = 'dbo' object_name = 'usp_test'/></tsql_stack> |
Ismert problémák
| Issue | Felderített dátum | Status | A megoldás dátuma |
|---|---|---|---|
| A hozzáférés-megsértési kivétel az SQL Server 2022 lekérdezéstárában (16.x) fordul elő bizonyos feltételek mellett. A PSP-optimalizálás lekérdezéstár-integrációjának engedélyezése esetén hozzáférés-megsértési kivételek léphetnek fel. További információkért tekintse meg a paraméterérzékeny terv optimalizálása, miért? | 2023 márciusa | Resolved | 2023. augusztus (CU 7) |
| Az SQL Server 2025 -ben (17.x) bizonyos feltételek mellett hozzáférés-megsértési kivétel léphet fel olvasható másodlagos replikákon. Hozzáférés-megsértési kivételek léphetnek fel, ha a PSP optimalizálása engedélyezve van egy olvasható másodlagos adatbázisban, amely úgy van konfigurálva, hogy a Lekérdezéstárat használja az olvasható másodfokú szolgáltatásokhoz . | 2025. szeptember | Van áthidaló megoldás |
Van áthidaló megoldás
Hozzáférés-megsértési kivétel bizonyos feltételek mellett olvasható másodlagos replikákon is előfordulhat
Az alábbi feltételeknek megfelelő lekérdezéseknél hozzáférés-megsértés fordulhat elő, ha egy PSP-lekérdezésvariáns nem képes meghatározni a szülő diszpécser utasításának tartós állapotát:
- A másodlagos replikán hajtották végre
- Érzékeny a paraméterszniffingre
- Paraméterérzékeny csomag (PSP) optimalizálására jogosult
Megkerülő megoldás: Tiltsa le a PSP-t minden olyan adatbázis másodlagos példányán, amelyet a Lekérdezéstár olvasható másodlagos példányok funkciójának használatára készítettek elő. Egy adott adatbázis kontextusából adja ki a következő Transact-SQL utasítást:
ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY
SET PARAMETER_SENSITIVE_PLAN_OPTIMIZATION = OFF;
Resolved
Hozzáférés-megsértési kivétel az SQL Server 2022 lekérdezéstárában fordul elő bizonyos feltételek mellett
Note
Az SQL Server 2022 (16.x) 7. kumulatív frissítése több javítást is kiadott egy versenyfeltételhez, amely hozzáférés-megsértéshez vezethet.
Ez a probléma annak köszönhető, hogy egy versenyállapot lép fel, amikor a végrehajtott lekérdezés futásidejű statisztikáit átviszik a lekérdezéstár (amely a MEMORYCLERK_QUERYDISKSTORE_HASHMAP memóriajegyzőben található) memóriaképéből a lekérdezéstár lemezverziójába. A futásidejű statisztikák a memóriában maradnak egy ideig, amelyet az DATA_FLUSH_INTERVAL_SECONDSSET QUERY_STORE utasítás opciója határoz meg (az alapértelmezett érték 15 perc). A Management Studio Lekérdezéstár párbeszédpanelen megadhatja az adatöblítési időköz (perc) értékét, amelyet a rendszer belsőleg másodpercre konvertál. Ha a rendszer memóriaterhelés alatt áll, a futásidejű statisztikák a beállítással DATA_FLUSH_INTERVAL_SECONDS definiáltnál korábbi lemezre üríthetők. Ha a Lekérdezéstárból történő lekérdezési terv tisztításhoz kapcsolódó háttérszálak (nevezetesen STALE_QUERY_THRESHOLD_DAYS és/vagy MAX_STORAGE_SIZE_MB Lekérdezéstár beállítások) futnak, előfordulhat olyan forgatókönyv, amelyben a lekérdezés variáns és/vagy a hozzá kapcsolódó diszpécser utasítás idő előtt elveszítheti a hivatkozását. Ez hozzáférés-megsértést okozhat a lekérdezési változatok lekérdezéstárba való beszúrása vagy törlése során.
A Lekérdezéstár műveleteivel kapcsolatos további információkért tekintse meg a Lekérdezéstár adatgyűjtése című cikk Megjegyzések szakaszát.