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


A lekérdezéstár használata In-Memory OLTP-vel

A következőkre vonatkozik:SQL ServerAzure SQL Database

Az SQL Server Query Store lehetővé teszi a natívan lefordított kód teljesítményének monitorozását a memóriában futó OLTP-t futtató számítási feladatokhoz.

A fordítási és futásidejű statisztikák gyűjtése és nyilvánosságra helyezése ugyanúgy történik, mint a lemezalapú számítási feladatok esetében. Ha a memóriában lévő OLTP-be migrál, az SQL Server Management Studióban továbbra is használhatja a Lekérdezéstár nézeteket, valamint a lemezalapú számítási feladatokhoz kifejlesztett egyéni szkripteket az áttelepítés előtt. Ezzel megtakaríthatja a lekérdezéstár technológiájának elsajátítására fordított befektetést, és használhatóvá teszi az összes számítási feladat hibaelhárításához.
A lekérdezéstár használatával kapcsolatos általános információkért tekintse meg a Lekérdezéstár használatával végzett teljesítményfigyelést.

A lekérdezéstár memóriabeli OLTP-vel való használatához nincs szükség további funkciókonfigurációra. Ha engedélyezi az adatbázison, az minden típusú számítási feladathoz használható.
A lekérdezéstár memórián belüli OLTP-vel való használatakor azonban a felhasználóknak tisztában kell lenniük néhány konkrét szemponttal:

  • Ha a Lekérdezéstár engedélyezve van, a rendszer alapértelmezés szerint összegyűjti a lekérdezéseket, a csomagokat és a fordítási idő statisztikáit. A futtatókörnyezeti statisztikák gyűjtése azonban csak akkor aktiválódik, ha explicit módon engedélyezi azt sys.sp_xtp_control_query_exec_stats (Transact-SQL) használatával.

  • Ha @new_collection_value 0 értékre állítja, a lekérdezéstár nem gyűjti az érintett eljárás vagy a teljes SQL Server-példány futásidejű statisztikáit.

  • A sys.sp_xtp_control_query_exec_stats (Transact-SQL) beállítással konfigurált érték nem marad meg. Ellenőrizze és konfigurálja újra a statisztikai gyűjteményt az SQL Server újraindítása után.

  • A rendszeres lekérdezési statisztikák gyűjtéséhez hasonlóan a teljesítmény is csökkenhet, ha a Lekérdezéstár használatával követi nyomon a számítási feladatok végrehajtását. Fontolja meg a statisztikák gyűjtésének engedélyezését csak a natívan lefordított tárolt eljárások fontos részhalmazához.

  • A lekérdezések és tervek rögzítése és tárolása az első natív fordításban történik, és minden újrafordításkor frissül.

  • Ha engedélyezte a Lekérdezéstárat, vagy törölte annak tartalmát az összes natív tárolt eljárás fordítása után, manuálisan kell újrafordítania őket, hogy a lekérdezéstár rögzítse őket. Ugyanez vonatkozik arra az esetre is, ha manuálisan eltávolította a lekérdezéseket sp_query_store_remove_query (Transact-SQL) vagy sp_query_store_remove_plan (Transact-SQL) használatával. A sp_recompile (Transact-SQL) használatával kényszerítse ki az eljárás újrafordítását.

  • A Lekérdezéstár a memóriabeli OLTP terv létrehozási mechanizmusait használja a lekérdezési végrehajtási tervek rögzítéséhez a fordítás során. A tárolt terv szemantikailag egyenértékű azzal, amit a SET SHOWPLAN_XML ON használatával kapna, egyetlen különbséggel: a Lekérdezéstárban lévő tervek egyéni utasításonként vannak felosztva és tárolva.

  • Ha vegyes számítási feladattal rendelkező adatbázisban futtatja a Lekérdezéstárat, a sys.query_store_plan (Transact-SQL)is_natively_compiled mezőjével gyorsan megtalálhatja a natív kódfordítás által létrehozott lekérdezésterveket.

  • A lekérdezéstár rögzítési módja (QUERY_CAPTURE_MODEparaméter az ALTER TABLE utasításban) nem befolyásolja a natívan lefordított modulok lekérdezéseit, mivel azok mindig rögzítve vannak a konfigurált értéktől függetlenül. Ebbe beletartozik a beállítás QUERY_CAPTURE_MODE = NONE.

  • A lekérdezéstár által rögzített lekérdezés-fordítás időtartama csak a lekérdezésoptimalizálással töltött időt tartalmazza a natív kód létrehozása előtt. Pontosabban nem tartalmaz időt a C-kód fordítására és a C-kód generáláshoz szükséges belső struktúrák létrehozására.

  • Az sys.query_store_runtime_stats (Transact-SQL) belüli metrikákat a rendszer nem tölti ki natívan lefordított lekérdezésekhez – az értékük mindig 0. A memóriahasználati oszlopok a következők: avg_query_max_used_memory, last_query_max_used_memory, min_query_max_used_memory, max_query_max_used_memory és stdev_query_max_used_memory.

A Lekérdezéstár engedélyezése és használata az In-Memory OLTP használatával

Az alábbi egyszerű példa bemutatja, hogyan használható a Lekérdezéstár memóriabeli OLTP-vel egy teljes körű felhasználói forgatókönyvben. Ebben a példában feltételezzük, hogy egy adatbázis (MemoryOLTP) engedélyezve van a memóriában lévő OLTP-hez.
A memóriaoptimalizált táblák előfeltételeiről további információt a Memory-Optimized tábla létrehozása és a natívan lefordított tárolt eljárás létrehozása című témakörben talál.

USE MemoryOLTP;
GO

-- Create a simple memory-optimized table
CREATE TABLE dbo.Ord
   (OrdNo INTEGER not null PRIMARY KEY NONCLUSTERED,
    OrdDate DATETIME not null,
    CustCode NVARCHAR(5) not null)
WITH (MEMORY_OPTIMIZED=ON);
GO

-- Enable Query Store before native module compilation
ALTER DATABASE MemoryOLTP SET QUERY_STORE = ON;
GO

-- Create natively compiled stored procedure
CREATE PROCEDURE dbo.OrderInsert(@OrdNo integer, @CustCode nvarchar(5))
WITH NATIVE_COMPILATION, SCHEMABINDING
AS
    BEGIN ATOMIC WITH
    (TRANSACTION ISOLATION LEVEL = SNAPSHOT,
    LANGUAGE = N'English')

    DECLARE @OrdDate DATETIME = GETDATE();
    INSERT INTO dbo.Ord (OrdNo, CustCode, OrdDate)
        VALUES (@OrdNo, @CustCode, @OrdDate);
END;
GO

-- Enable runtime stats collection for queries from dbo.OrderInsert stored procedure
DECLARE @db_id INT = DB_ID()
DECLARE @proc_id INT = OBJECT_ID('dbo.OrderInsert');
DECLARE @collection_enabled BIT;

EXEC [sys].[sp_xtp_control_query_exec_stats] @new_collection_value = 1,
    @database_id = @db_id, @xtp_object_id = @proc_id;

-- Check the state of the collection flag
EXEC sp_xtp_control_query_exec_stats @database_id = @db_id,
    @xtp_object_id = @proc_id,
    @old_collection_value= @collection_enabled output;
SELECT @collection_enabled AS 'collection status';

-- Execute natively compiled workload
EXEC dbo.OrderInsert 1, 'A';
EXEC dbo.OrderInsert 2, 'B';
EXEC dbo.OrderInsert 3, 'C';
EXEC dbo.OrderInsert 4, 'D';
EXEC dbo.OrderInsert 5, 'E';

-- Check Query Store Data
-- Compile time data
SELECT q.query_id, plan_id, object_id, query_hash, p.query_plan,
    p.initial_compile_start_time, p.last_compile_start_time,
    p.last_execution_time, p.avg_compile_duration,
    p.last_force_failure_reason, p.force_failure_count
FROM sys.query_store_query AS q
JOIN sys.query_store_plan AS p
    ON q.query_id = p.plan_id
WHERE q.object_id = OBJECT_ID('dbo.OrderInsert');

-- Get runtime stats
-- Check count_executions field to verify that runtime statistics
-- have been collected by the Query Store
SELECT q.query_id, p.plan_id, object_id, rsi.start_time, rsi.end_time,
    p.last_force_failure_reason, p.force_failure_count, rs.*
FROM sys.query_store_query AS q
JOIN sys.query_store_plan AS p
    ON q.query_id = p.plan_id
JOIN sys.query_store_runtime_stats AS rs
    ON rs.plan_id = p.plan_id
JOIN sys.query_store_runtime_stats_interval AS rsi
    ON rs.runtime_stats_interval_id = rsi.runtime_stats_interval_id
WHERE q.object_id = OBJECT_ID('dbo.OrderInsert');

Lásd még