Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Met SQL Server Query Store kunt u de prestaties van systeemeigen gecompileerde code bewaken voor workloads met OLTP in het geheugen.
Compileer- en runtimestatistieken worden verzameld en weergegeven op dezelfde manier als voor werkbelastingen op basis van schijven.
Wanneer u migreert naar OLTP in het geheugen, kunt u Query Store-weergaven blijven gebruiken in SQL Server Management Studio en aangepaste scripts die u hebt ontwikkeld voor schijfworkloads vóór de migratie. Dit bespaart uw investering in het leren van Query Store-technologie en maakt het bruikbaar voor het oplossen van problemen met alle workloads.
Zie Prestaties bewaken met behulp van de Query Store voor algemene informatie over het gebruik van de Query Store.
Voor het gebruik van Query Store met OLTP in het geheugen is geen aanvullende functieconfiguratie vereist. Wanneer u deze inschakelt in uw database, werkt deze voor alle typen workloads.
Er zijn echter enkele specifieke aspecten waar gebruikers rekening mee moeten houden bij het gebruik van Query Store met OLTP in het geheugen:
Wanneer Query Store is ingeschakeld, worden query's, plannen en compileertijdstatistieken standaard verzameld. Het verzamelen van runtimestatistieken wordt echter alleen geactiveerd als u deze expliciet inschakelt met sys.sp_xtp_control_query_exec_stats (Transact-SQL).
Wanneer u @new_collection_value instelt op 0, stopt de Query Store met het verzamelen van runtimestatistieken voor de betrokken procedure of het hele SQL Server-exemplaar.
De waarde die is geconfigureerd met sys.sp_xtp_control_query_exec_stats (Transact-SQL) wordt niet behouden. Zorg ervoor dat u de verzameling statistieken controleert en opnieuw configureert nadat u SQL Server opnieuw hebt opgestart.
Net als bij het verzamelen van reguliere querystatistieken kunnen de prestaties afnemen wanneer u Query Store gebruikt om de uitvoering van workloads bij te houden. U kunt het verzamelen van statistieken alleen inschakelen voor een belangrijke subset van systeemeigen gecompileerde opgeslagen procedures.
Query's en plannen worden vastgelegd en opgeslagen op de eerste systeemeigen compilatie en bijgewerkt bij elke hercompilatie.
Als u Query Store hebt ingeschakeld of de inhoud ervan hebt gewist nadat alle systeemeigen opgeslagen procedures zijn gecompileerd, moet u ze handmatig opnieuw compileren om ze vast te leggen door de Query Store. Hetzelfde geldt als u query's handmatig hebt verwijderd met behulp van sp_query_store_remove_query (Transact-SQL) of sp_query_store_remove_plan (Transact-SQL). Gebruik sp_recompile (Transact-SQL) om hercompilatie van procedures af te dwingen.
Query Store maakt gebruik van mechanismen voor het genereren van plannen van OLTP in het geheugen om het uitvoeringsplan voor query's vast te leggen tijdens de compilatie. Opgeslagen plan is semantisch gelijk aan een plan dat u zou krijgen met
SET SHOWPLAN_XML ON, met één verschil: plannen in Query Store worden gesplitst en opgeslagen per afzonderlijke instructie.Wanneer u Query Store uitvoert in een database met een gemengde workload, kunt u het veld is_natively_compiled uit sys.query_store_plan (Transact-SQL) gebruiken om snel queryplannen te vinden die worden gegenereerd door de systeemeigen codecompilatie.
De opnamemodus van Query Store (QUERY_CAPTURE_MODE parameter in de instructie ALTER TABLE ) heeft geen invloed op query's van systeemeigen gecompileerde modules, omdat deze altijd worden vastgelegd, ongeacht de geconfigureerde waarde. Dit omvat instelling
QUERY_CAPTURE_MODE = NONE.De duur van de querycompilatie die door de Query Store is vastgelegd, omvat alleen de tijd die is besteed aan queryoptimalisatie voordat de systeemeigen code werd gegenereerd. Om precies te zijn, bevat het geen tijd voor het compileren van C-code en het genereren van interne structuren die nodig zijn voor het genereren van C-code.
Geheugen toewijzingsstatistieken binnen sys.query_store_runtime_stats (Transact-SQL) worden niet ingevuld voor natuurlijk gecompileerde query's. Hun waarden zijn altijd 0. De kolommen voor geheugentoekenning zijn: avg_query_max_used_memory, last_query_max_used_memory, min_query_max_used_memory, max_query_max_used_memory en stdev_query_max_used_memory.
Query Store inschakelen en gebruiken met In-Memory OLTP
In het volgende eenvoudige voorbeeld ziet u hoe u Query Store gebruikt met OLTP in het geheugen in een end-to-end gebruikersscenario. In dit voorbeeld wordt ervan uitgegaan dat een database (MemoryOLTP) is ingeschakeld voor OLTP in het geheugen.
Zie voor meer informatie over vereisten voor geheugen-geoptimaliseerde tabellen Een geheugen-geoptimaliseerde tabel en een natuurlijk gecompileerde opgeslagen procedure maken.
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');