Partilhar via


Use a Loja de Consultas com In-Memory OLTP

Aplica-se a:SQL ServerBanco de Dados SQL do Azure

O SQL Server Query Store permite-lhe monitorizar o desempenho de código compilado nativamente para cargas de trabalho a correr OLTP em memória.

As estatísticas de compilação e de execução são recolhidas e expostas da mesma forma que para cargas de trabalho baseadas em disco. Quando migra para OLTP em memória, pode continuar a usar as vistas da Query Store no SQL Server Management Studio e scripts personalizados que desenvolveu para cargas de trabalho baseadas em disco antes da migração. Isto poupa o seu investimento na aprendizagem da tecnologia da Loja de Consultas e torna-a utilizável para resolver problemas de todas as cargas de trabalho.
Para informações gerais sobre a utilização da Loja de Consultas, veja Monitorização do Desempenho Usando a Loja de Consultas.

Usar a Loja de Consultas com OLTP em memória não requer configuração adicional de funcionalidades. Quando o ativas na tua base de dados, funciona para todos os tipos de cargas de trabalho.
No entanto, existem alguns aspetos específicos de que os utilizadores devem estar cientes ao usar o Query Store com OLTP em memória:

  • Quando o Query Store está ativado, as consultas, planos e estatísticas de compilação são coletadas por defeito. No entanto, a recolha de estatísticas em tempo de execução só é ativada se a ativar explicitamente com sys.sp_xtp_control_query_exec_stats (Transact-SQL).

  • Quando defines @new_collection_value para 0, a Loja de Consultas deixa de recolher estatísticas de execução para o procedimento afetado ou para toda a instância do SQL Server.

  • O valor configurado com sys.sp_xtp_control_query_exec_stats (Transact-SQL) não é mantido. Certifica-te de verificar e configurar novamente a recolha de estatísticas depois de reiniciares o SQL Server.

  • Tal como na recolha regular de estatísticas de consulta, o desempenho pode diminuir quando utiliza a Loja de Consultas para acompanhar a execução da carga de trabalho. Considere permitir a recolha de estatísticas apenas para um subconjunto importante de procedimentos armazenados compilados nativamente.

  • As consultas e planos são capturados e armazenados na primeira compilação nativa e atualizados a cada recompilação.

  • Se ativaste a Loja de Consultas ou limpaste o seu conteúdo depois de todos os procedimentos armazenados nativos estarem compilados, tens de os recompilar manualmente para que sejam capturados pela Loja de Consultas. O mesmo se aplica se removeste consultas manualmente usando sp_query_store_remove_query (Transact-SQL) ou sp_query_store_remove_plan (Transact-SQL). Use sp_recompile (Transact-SQL) para forçar a recompilação de procedimentos.

  • O Query Store utiliza mecanismos de geração de planos do OLTP em memória para captar o plano de execução da consulta durante a compilação. O plano armazenado é semanticamente equivalente a um que se obteria usando SET SHOWPLAN_XML ON com uma diferença; os planos na Loja de Consultas são divididos e armazenados por instrução individual.

  • Quando executas o Query Store numa base de dados com uma carga de trabalho mista, podes usar o campo is_natively_compiled de sys.query_store_plan (Transact-SQL) para encontrar rapidamente planos de consulta gerados pela compilação de código nativo.

  • O modo de captura Query Store (QUERY_CAPTURE_MODE parâmetro na instrução ALTER TABLE ) não afeta as consultas de módulos compilados nativamente, pois são sempre capturadas independentemente do valor configurado. Isto inclui definir QUERY_CAPTURE_MODE = NONE.

  • A duração da compilação de consultas capturada pela Loja de Consultas inclui apenas o tempo gasto na otimização de consultas antes de o código nativo ser gerado. Mais precisamente, não inclui tempo para compilação de código C e geração de estruturas internas necessárias para a geração de código C.

  • As métricas de concessão de memória dentro de sys.query_store_runtime_stats (Transact-SQL) não são preenchidas para consultas compiladas nativamente – os seus valores são sempre 0. As colunas de concessões de memória são: avg_query_max_used_memory, last_query_max_used_memory, min_query_max_used_memory, max_query_max_used_memory e stdev_query_max_used_memory.

Ativar e usar o Query Store com In-Memory OLTP

O exemplo simples seguinte demonstra o uso do Query Store com OLTP em memória num cenário de utilizador de ponta a ponta. Neste exemplo, assumimos que uma base de dados (MemoryOLTP) está ativada para OLTP em memória.
Para mais informações sobre requisitos para tabelas otimizadas por memória, consulte Criação de uma Tabela Otimizada por Memória e um Procedimento Armazenado Compilado Nativamente.

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');

Consulte também