Megosztás a következőn keresztül:


Lekérdezéstári tippek

A következőkre vonatkozik: Az SQL Server 2022 (16.x) és újabb verziói az Azure SQL DatabaseAzure SQL Managed InstanceSQL-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.

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.

Lekérdezéstár-tippek munkafolyamata.

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 TOP lekérdezés sorcél-optimalizálásának letiltása.

Lekérdezéstár-tippek használata:

  1. 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:

  2. Hajtsa végre a sys.sp_query_store_set_hints-t a query_id paramé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 RECOMPILE tippet használó Lekérdezéstár-tippek bármilyen támogatott kompatibilitási szinten használhatók.
  • 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_id nem 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_EXECUTION jelzé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 RECOMPILE tipp 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 a RECOMPILE tipp egy lekérdezés Lekérdezéstár-tippjeinek része, az adatbázismotor figyelmen kívül hagyja a RECOMPILE tippet, és minden más tippet alkalmaz, ha meg van adva.
  • 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.

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;