Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
azure SQL Database
Úložiště dotazů SQL Serveru umožňuje monitorovat výkon nativně zkompilovaného kódu pro úlohy spuštěné v paměti OLTP.
Statistiky kompilace a modulu runtime se shromažďují a zveřejňují stejným způsobem jako u úloh založených na discích.
Při migraci na OLTP v paměti můžete dál používat zobrazení úložiště dotazů v sadě SQL Server Management Studio a vlastní skripty, které jste před migrací vyvinuli pro úlohy založené na disku. Tím zachováte hodnotu své investice do nauky technologie Query Store a umožníte její využití při řešení potíží u všech úloh.
Obecné informace o používání úložiště dotazů najdete v tématu Monitorování výkonu pomocí úložiště dotazů.
Použití úložiště dotazů s OLTP v paměti nevyžaduje žádnou další konfiguraci funkcí. Když ji povolíte ve své databázi, bude fungovat pro všechny typy úloh.
Při použití úložiště dotazů s OLTP v paměti byste ale měli vědět o některých konkrétních aspektech:
Pokud je povolené úložiště dotazů, ve výchozím nastavení se shromažďují dotazy, plány a statistiky doby kompilace. Shromažďování statistik modulu runtime je však aktivováno pouze v případě, že ji explicitně povolíte pomocí sys.sp_xtp_control_query_exec_stats (Transact-SQL).
Když nastavíte @new_collection_value na hodnotu 0, úložiště dotazů přestane shromažďovat statistiky modulu runtime pro ovlivněnou proceduru nebo celou instanci SQL Serveru.
Hodnota nakonfigurovaná pomocí sys.sp_xtp_control_query_exec_stats (Transact-SQL) není trvalá. Po restartování SQL Serveru nezapomeňte znovu zkontrolovat a nakonfigurovat kolekci statistik.
Stejně jako u pravidelného shromažďování statistik dotazů se výkon může snížit, když ke sledování provádění úloh používáte úložiště dotazů. Zvažte povolení shromažďování statistik pouze pro důležitou podmnožinu nativně zkompilovaných uložených procedur.
Dotazy a plány se zaznamenávají a ukládají na první nativní kompilaci a aktualizují se při každé rekompilace.
Pokud jste povolili úložiště dotazů nebo vymazali jeho obsah po kompilaci všech nativních uložených procedur, musíte je znovu zkompilovat ručně, aby bylo možné je zachytit úložištěm dotazů. Totéž platí, pokud jste dotazy odebrali ručně pomocí sp_query_store_remove_query (Transact-SQL) nebo sp_query_store_remove_plan (Transact-SQL). K vynucení rekompilace procedury použijte sp_recompile (Transact-SQL).
Úložiště dotazů využívá mechanismy generování plánů z OLTP v paměti k zachycení plánu provádění dotazů během kompilace. Uložený plán je sémanticky ekvivalentní plánu, který byste získali pomocí
SET SHOWPLAN_XML ON, s jedním rozdílem: plány v úložišti dotazů jsou rozdělené a uložené podle jednotlivých příkazů.Když spustíte úložiště dotazů v databázi se smíšeným zatížením, můžete pomocí pole is_natively_compiled z sys.query_store_plan (Transact-SQL) rychle najít plány dotazů vygenerované kompilací nativního kódu.
Režim zachycení úložiště dotazů (QUERY_CAPTURE_MODE parametr v příkazu ALTER TABLE ) nemá vliv na dotazy z nativně kompilovaných modulů, protože se vždy zaznamenávají bez ohledu na nakonfigurovanou hodnotu. To zahrnuje nastavení
QUERY_CAPTURE_MODE = NONE.Doba trvání kompilace dotazu zachycená úložištěm dotazů zahrnuje pouze čas strávený optimalizací dotazů před vygenerováním nativního kódu. Přesněji řečeno, nezahrnuje čas kompilace kódu jazyka C a generování interních struktur nezbytných pro generování kódu jazyka C.
Metriky udělování paměti v tabulce sys.query_store_runtime_stats (Transact-SQL) nejsou vyplněny pro nativně kompilované dotazy – jejich hodnoty jsou vždy 0. Sloupce udělené paměti jsou: avg_query_max_used_memory, last_query_max_used_memory, min_query_max_used_memory, max_query_max_used_memory a stdev_query_max_used_memory.
Povolit a používat Úložiště dotazů s In-Memory OLTP
Následující jednoduchý příklad ukazuje použití úložiště dotazů s OLTP v paměti ve scénáři koncového uživatele. V tomto příkladu předpokládáme, že databáze (MemoryOLTP) je povolená pro OLTP v paměti.
Další informace o požadavcích pro tabulky optimalizované pro paměť naleznete viz Vytvoření tabulky optimalizované pro paměť a nativně zkompilované uložené procedury.
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');
Viz také
- monitorování výkonu pomocí úložiště dotazů
- Vytvoření paměťově optimalizované tabulky a předem zkompilované uložené procedury
- Nejlepší praxe s úložištěm dotazů
- Uložené procedury Query Store (Transact-SQL)
- zobrazení katalogu úložiště dotazů (Transact-SQL)