Monitorar o desempenho usando o Repositório de ConsultasMonitoring performance by using the Query Store

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure nãoAzure Synapse Analytics (SQL DW) nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

O recurso Repositório de Consultas do SQL ServerSQL Server fornece informações sobre escolha e desempenho do plano de consulta.The SQL ServerSQL Server Query Store feature provides you with insight on query plan choice and performance. Ele simplifica a solução de problemas, ajudando você a identificar rapidamente diferenças de desempenho causadas por alterações nos planos de consulta.It simplifies performance troubleshooting by helping you quickly find performance differences caused by query plan changes. O Repositório de Consultas captura automaticamente um histórico das consultas, dos planos e das estatísticas de tempo de execução e os mantém para sua análise.Query Store automatically captures a history of queries, plans, and runtime statistics, and retains these for your review. Ele separa os dados por janelas por hora, permitindo que você veja os padrões de uso do banco de dados e entenda quando as alterações aos planos de consulta ocorreram no servidor.It separates data by time windows so you can see database usage patterns and understand when query plan changes happened on the server. O repositório de consultas pode ser configurado usando a opção ALTER DATABASE SET .You can configure query store using the ALTER DATABASE SET option.

Para obter informações sobre como operar o Repositório de Consultas no Banco de Dados SQLSQL Database do Azure, consulte Operando o Repositório de Consultas no Banco de dados SQL do Azure.For information about operating the Query Store in Azure Banco de Dados SQLSQL Database, see Operating the Query Store in Azure SQL Database.

Importante

Se você estiver usando o Repositório de Consultas para obter informações de carga de trabalho em tempo real no SQL Server 2016 (13.x)SQL Server 2016 (13.x), planeje instalar as correções de escalabilidade de desempenho na KB 4340759 assim que possível.If you are using Query Store for just in time workload insights in SQL Server 2016 (13.x)SQL Server 2016 (13.x), plan to install the performance scalability fixes in KB 4340759 as soon as possible.

Habilitando o Repositório de ConsultasEnabling the Query Store

O repositório de consultas não está ativo para novos bancos de dados por padrão.Query Store is not active for new databases by default.

Use a Página do Repositório de Consultas em SQL Server Management StudioSQL Server Management StudioUse the Query Store Page in SQL Server Management StudioSQL Server Management Studio

  1. No Pesquisador de Objetos, clique com o botão direito do mouse em um banco de dados e clique em Propriedades.In Object Explorer, right-click a database, and then click Properties.

    Observação

    Exige, no mínimo, a versão 16 do Management StudioManagement Studio.Requires at least version 16 of Management StudioManagement Studio.

  2. Na caixa de diálogo Propriedades do Banco de Dados , selecione a página Repositório de Consultas .In the Database Properties dialog box, select the Query Store page.

  3. Na caixa Modo de Operação (Solicitado) , selecione Leitura Gravação.In the Operation Mode (Requested) box, select Read Write.

Usar Instruções Transact-SQLUse Transact-SQL Statements

Use a instrução ALTER DATABASE para habilitar o repositório de consultas.Use the ALTER DATABASE statement to enable the query store. Por exemplo:For example:

ALTER DATABASE AdventureWorks2012 
SET QUERY_STORE = ON (OPERATION_MODE = READ_WRITE); 

Para obter mais opções de sintaxe relacionadas ao Repositório de Consultas, confira Opções ALTER DATABASE SET (Transact-SQL).For more syntax options related to the Query Store, see ALTER DATABASE SET Options (Transact-SQL).

Observação

O Repositório de Consultas não pode ser habilitado nos bancos de dados mestre ou tempdb.Query Store cannot be enabled for the master or tempdb databases.

Importante

Para obter informações sobre como habilitar o Repositório de Consultas e mantê-lo ajustado a sua carga de trabalho, consulte Melhor Prática do Repositório de Consultas.For information on enabling Query Store and keeping it adjusted to your workload, refer to Best Practice with the Query Store.

Informações no Repositório de ConsultasInformation in the Query Store

Planos de execução para qualquer consulta específica no SQL ServerSQL Server normalmente envolvem horas extras por vários motivos diferentes, como alterações de estatísticas, alterações de esquema, criação/exclusão de índices, etc. O cache de procedimento (no qual os planos de consulta em cache são armazenados) armazena apenas o plano de execução mais recente.Execution plans for any specific query in SQL ServerSQL Server typically evolve over time due to a number of different reasons such as statistics changes, schema changes, creation/deletion of indexes, etc. The procedure cache (where cached query plans are stored) only stores the latest execution plan. Os planos também são removidos do cache do plano devido à pressão da memória.Plans also get evicted from the plan cache due to memory pressure. Como resultado, as regressões do desempenho de consulta causadas por alterações no plano de execução podem não ser triviais e podem ter resolução lenta.As a result, query performance regressions caused by execution plan changes can be non-trivial and time consuming to resolve.

Como o Repositório de Consultas mantém vários planos de execução por consulta, ele pode impor políticas para instruir o Processador de Consultas a usar um plano de execução específico para uma consulta.Since the Query Store retains multiple execution plans per query, it can enforce policies to direct the Query Processor to use a specific execution plan for a query. Isso é conhecido como imposição de plano.This is referred to as plan forcing. A imposição de plano no repositório de consultas é fornecida usando um mecanismo semelhante à dica de consulta USE PLAN , mas não requer nenhuma alteração nos aplicativos do usuário.Plan forcing in Query Store is provided by using a mechanism similar to the USE PLAN query hint, but it does not require any change in user applications. A imposição de plano pode resolver uma regressão de desempenho de consulta causada por uma alteração do plano em um período muito curto.Plan forcing can resolve a query performance regression caused by a plan change in a very short period of time.

Observação

O Repositório de Consultas coleta planos para Instruções DML, como SELECT, INSERT, UPDATE, DELETE, MERGE e BULK INSERT.Query Store collects plans for DML Statements such as SELECT, INSERT, UPDATE, DELETE, MERGE, and BULK INSERT.

Observação

O Repositório de Consultas não coleta dados para procedimentos armazenados compilados nativamente por padrão.Query Store does not collect data for natively compiled stored procedures by default. Use sys.sp_xtp_control_query_exec_stats para habilitar a coleta de dados para procedimentos armazenados compilados nativamente.Use sys.sp_xtp_control_query_exec_stats to enable data collection for natively compiled stored procedures.

As estatísticas de espera são outra fonte de informações que ajudam a solucionar problemas de desempenho no Mecanismo de Banco de DadosDatabase Engine.Wait stats are another source of information that helps to troubleshoot performance in the Mecanismo de Banco de DadosDatabase Engine. Por muito tempo, as estatísticas de espera estavam disponíveis somente no nível da instância, o que dificultava o retorno das esperas de uma consulta específica.For a long time, wait statistics were available only on instance level, which made it hard to backtrack waits to a specific query. No SQL Server 2017 (14.x)SQL Server 2017 (14.x) e no Banco de dados SQL do AzureAzure SQL Database em diante, o Repositório de Consultas inclui uma dimensão que acompanha as estatísticas de espera. O exemplo a seguir habilita o Repositório de Consultas para coletar estatísticas de espera.Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x) and Banco de dados SQL do AzureAzure SQL Database, Query Store includes a dimension that tracks wait stats. The following example enables the Query Store to collect wait stats.

ALTER DATABASE AdventureWorks2012 
SET QUERY_STORE = ON ( WAIT_STATS_CAPTURE_MODE = ON );

Cenários comuns para o uso do recurso Repositório de Consultas são:Common scenarios for using the Query Store feature are:

  • Localizar e corrigir rapidamente uma regressão de desempenho do plano, forçando o plano de consulta anterior.Quickly find and fix a plan performance regression by forcing the previous query plan. Corrigir consultas com regressão recente no desempenho devido a alterações no plano de execução.Fix queries that have recently regressed in performance due to execution plan changes.
  • Determinar o número de vezes que uma consulta foi executada em determinada janela de tempo, auxiliando um DBA na solução de problemas de recurso de desempenho.Determine the number of times a query was executed in a given time window, assisting a DBA in troubleshooting performance resource problems.
  • Identificar as principais consultas n (por tempo de execução, consumo de memória, etc.) nas últimas x horas.Identify top n queries (by execution time, memory consumption, etc.) in the past x hours.
  • Fazer auditoria de histórico dos planos de consulta para determinada consulta.Audit the history of query plans for a given query.
  • Analisar os padrões de uso dos recursos (CPU, E/S e memória) para determinado banco de dados.Analyze the resource (CPU, I/O, and Memory) usage patterns for a particular database.
  • Identifique as principais n consultas que estão esperando em recursos.Identify top n queries that are waiting on resources.
  • Entenda a natureza de espera de um plano ou de uma consulta específica.Understand wait nature for a particular query or plan.

O Repositório de Consultas contém três repositórios:The Query Store contains three stores:

  • um repositório de plano para persistir as informações do plano de execução.a plan store for persisting the execution plan information.
  • um repositório de estatísticas de tempo de execução para manter as informações de estatísticas de execução.a runtime stats store for persisting the execution statistics information.
  • um repositório de estatísticas de espera para manter as informações de estatísticas de espera.a wait stats store for persisting wait statistics information.

O número de planos exclusivos que pode ser armazenado para uma consulta no repositório de planos é limitado pela opção de configuração max_plans_per_query .The number of unique plans that can be stored for a query in the plan store is limited by the max_plans_per_query configuration option. Para melhorar o desempenho, as informações são gravadas nos repositórios de forma assíncrona.To enhance performance, the information is written to the stores asynchronously. Para otimizar o uso do espaço, as estatísticas de tempo de execução no repositório de estatísticas de tempo de execução são agregadas em uma janela de tempo fixa.To minimize space usage, the runtime execution statistics in the runtime stats store are aggregated over a fixed time window. As informações nesses repositórios são visíveis pela consulta das exibições de catálogo do Repositório de Consultas.The information in these stores is visible by querying the Query Store catalog views.

A consulta a seguir retorna informações sobre consultas e planos no Repositório de Consultas.The following query returns information about queries and plans in the Query Store.

SELECT Txt.query_text_id, Txt.query_sql_text, Pl.plan_id, Qry.*  
FROM sys.query_store_plan AS Pl  
INNER JOIN sys.query_store_query AS Qry  
    ON Pl.query_id = Qry.query_id  
INNER JOIN sys.query_store_query_text AS Txt  
    ON Qry.query_text_id = Txt.query_text_id ;  

Usar o recurso Consultas RegredidasUse the Regressed Queries feature

Depois de habilitar o Repositório de Consultas, atualize a parte do banco de dados do painel Pesquisador de Objetos para adicionar a seção Repositório de Consultas.After enabling the Query Store, refresh the database portion of the Object Explorer pane to add the Query Store section.

Árvore de Repositório de Consultas do SQL Server 2016 no Pesquisador de Objetos do SSMSÁrvore de Repositório de Consultas do SQL Server 2017 no Pesquisador de Objetos do SSMSSQL Server 2016 Query Store tree in SSMS Object Explorer SQL Server 2017 Query Store tree in SSMS Object Explorer

Selecione Consultas Regredidas para abrir o painel Consultas Regredidas no SQL Server Management StudioSQL Server Management Studio.Select Regressed Queries to open the Regressed Queries pane in SQL Server Management StudioSQL Server Management Studio. O painel Consultas Regredidas mostra consultas e planos no repositório de consultas.The Regressed Queries pane shows you the queries and plans in the query store. Use as caixas de listas suspensas na parte superior para filtrar consultas com base em vários critérios: Duração (ms) (Padrão), Tempo de CPU (ms), Leituras Lógicas, Gravações Lógicas (KB), Leituras Físicas (KB), Tempo CLR (ms), DOP, Consumo de Memória (KB), Contagem de Linhas, Memória de Log Usada (KB), Memória de BD Temporária Usada (KB) e Tempo de Espera (ms).Use the drop down boxes at the top to filter queries based on various criteria: Duration (ms) (Default), CPU Time (ms), Logical Reads (KB), Logical Writes (KB), Physical Reads (KB), CLR Time (ms), DOP, Memory Consumption (KB), Row Count, Log Memory Used (KB), Temp DB Memory Used (KB), and Wait Time (ms).
Selecione um plano para ver o plano de consulta gráfico.Select a plan to see the graphical query plan. Há botões disponíveis para exibir a consulta de origem, para forçar e não forçar um plano de consulta, para alternar entre os formatos de grade e gráfico, para comparar os planos selecionados (se houver mais de um selecionado) e para atualizar a exibição.Buttons are available to view the source query, force and unforce a query plan, toggle between grid and chart formats, compare selected plans (if more than one is selected), and refresh the display.

Consultas Retornadas do SQL Server 2016 no Pesquisador de Objetos do SSMSSQL Server 2016 Regressed Queries in SSMS Object Explorer

Para impor um plano, selecione uma consulta e um plano e, em seguida, clique em Impor Plano.To force a plan, select a query and plan, and then click Force Plan. Você pode impor apenas planos que foram salvos pelo recurso de plano de consulta e ainda são mantidos no cache do plano de consulta.You can only force plans that were saved by the query plan feature and are still retained in the query plan cache.

Como localizar consultas em esperaFinding waiting queries

No SQL Server 2017 (14.x)SQL Server 2017 (14.x) e no Banco de dados SQL do AzureAzure SQL Database em diante, as estatísticas de espera por consulta ao longo do tempo estão disponíveis no Repositório de Consultas.Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x) and Banco de dados SQL do AzureAzure SQL Database, wait statistics per query over time are available in Query Store.

No Repositório de Consultas, os tipos de espera são combinados em categorias de espera.In Query Store, wait types are combined into wait categories. O mapeamento das categorias de espera para tipos de espera está disponível em sys.query_store_wait_stats (Transact-SQL).The mapping of wait categories to wait types is available in sys.query_store_wait_stats (Transact-SQL).

Selecione Estatísticas de Espera da Consulta para abrir o painel Estatísticas de Espera da Consulta no SQL Server Management StudioSQL Server Management Studio v18 ou superior.Select Query Wait Statistics to open the Query Wait Statistics pane in SQL Server Management StudioSQL Server Management Studio v18 or higher. O painel Estatísticas de Espera da Consulta mostra a você um gráfico de barras que contém os principais categorias de espera no Repositório de Consultas.The Query Wait Statistics pane shows you a bar chart containing the top wait categories in the Query Store. Use lista suspensa na parte superior para selecionar um critério de agregação para o tempo de espera: avg, max, min, std dev e total (padrão).Use the drop down at the top to select an aggregate criteria for the wait time: avg, max, min, std dev, and total (default).

Estatísticas de espera de consulta do SQL Server 2017 no Pesquisador de Objetos do SSMSSQL Server 2017 Query Wait Statistics in SSMS Object Explorer

Selecione uma categoria de espera clicando na barra e uma exibição de detalhes é mostrada na categoria de espera selecionada.Select a wait category by clicking on the bar and a detail view on the selected wait category displays. Esse novo gráfico de barras contém as consultas que contribuíram para essa categoria de espera.This new bar chart contains the queries that contributed to that wait category.

Exibição de detalhes das Estatísticas de espera de consulta do SQL Server 2017 no Pesquisador de Objetos do SSMSSQL Server 2017 Query Wait Statistics detail view in SSMS Object Explorer

Use a lista suspensa na parte superior para filtrar consultas com base em vários critérios de tempo de espera para a categoria de espera selecionada: avg, max, min, std dev e total (padrão).Use the drop down box at the top to filter queries based on various wait time criteria for the selected wait category: avg, max, min, std dev, and total (default). Selecione um plano para ver o plano de consulta gráfico.Select a plan to see the graphical query plan. Botões estão disponíveis para exibir a consulta de origem, impor e cancelar a imposição de um plano de consulta e atualizar a exibição.Buttons are available to view the source query, force, and unforce a query plan, and refresh the display.

As categorias de espera combinam tipos diferentes de espera em buckets semelhantes por natureza.Wait categories are combining different wait types into buckets similar by nature. Categorias de espera diferentes exigem um acompanhamento de análise diferente para resolver o problema, mas os tipos de espera da mesma categoria levam a experiências de solução de problemas muito semelhantes e fornecer a consulta afetada com base nas esperas seria a peça que faltava para concluir a maioria dessas investigações de com êxito.Different wait categories require a different follow up analysis to resolve the issue, but wait types from the same category lead to very similar troubleshooting experiences, and providing the affected query on top of waits would be the missing piece to complete the majority of such investigations successfully.

Aqui estão alguns exemplos de como você pode obter mais informações sobre sua carga de trabalho antes e depois de introduzir as categorias de espera no Repositório de Consultas:Here are some examples how you can get more insights into your workload before and after introducing wait categories in Query Store:

Experiência anteriorPrevious experience Nova experiênciaNew experience AçãoAction
RESOURCE_SEMAPHORE alto de esperas por banco de dadosHigh RESOURCE_SEMAPHORE waits per database Esperas de memória alta no Repositório de Consultas para consultas específicasHigh Memory waits in Query Store for specific queries Localize as consultas com maior consumo de memória no Repositório de Consultas.Find the top memory consuming queries in Query Store. Essas consultas estão provavelmente atrasando o andamento das consultas afetadas.These queries are probably delaying further progress of the affected queries. Considere usar a dica de consulta MAX_GRANT_PERCENT para essas consultas ou para as consultas afetadas.Consider using MAX_GRANT_PERCENT query hint for these queries, or for the affected queries.
Espera de LCK_M_X alta por banco de dadosHigh LCK_M_X waits per database Esperas de bloqueio altas no Repositório de Consultas para consultas específicasHigh Lock waits in Query Store for specific queries Verifique os textos de consulta das consultas afetadas e identifique as entidades de destino.Check the query texts for the affected queries and identify the target entities. Pesquise outras consultas no Repositório de Consultas que modificam a mesma entidade, que são executadas com frequência e/ou têm alta duração.Look in Query Store for other queries modifying the same entity, which are executed frequently and/or have high duration. Depois de identificar essas consultas, considere alterar a lógica do aplicativo para melhorar a simultaneidade ou use um nível de isolamento menos restritivo.After identifying these queries, consider changing the application logic to improve concurrency, or use a less restrictive isolation level.
Esperas de PAGEIOLATCH_SH altas por banco de dadosHigh PAGEIOLATCH_SH waits per database Esperas de buffer de E/S altas no Repositório de Consultas para consultas específicasHigh Buffer IO waits in Query Store for specific queries Localize as consultas com um grande número de leituras físicas no Repositório de Consultas.Find the queries with a high number of physical reads in Query Store. Se elas corresponderem às consultas com esperas de E/S, considere introduzir um índice na entidade subjacente, para fazer buscas em vez de verificações e, portanto, minimizar a sobrecarga de E/S das consultas.If they match the queries with high IO waits, consider introducing an index on the underlying entity, in order to do seeks instead of scans, and thus minimize the IO overhead of the queries.
Esperas de SOS_SCHEDULER_YIELD altas por banco de dadosHigh SOS_SCHEDULER_YIELD waits per database Esperas de CPU altas no Repositório de Consultas para consultas específicasHigh CPU waits in Query Store for specific queries Localize as consultas com maior consumo de CPU no Repositório de Consultas.Find the top CPU consuming queries in Query Store. Entre elas, identifique as consultas para as quais a tendência de CPU alta se correlaciona às esperas de CPU altas para as consultas afetadas.Among them, identify the queries for which high CPU trend correlates with high CPU waits for the affected queries. Concentre-se em otimizar essas consultas – poderia haver uma regressão de plano ou talvez um índice ausente.Focus on optimizing those queries - there could be a plan regression, or perhaps a missing index.

Opções de configuraçãoConfiguration Options

As opções a seguir estão disponíveis para configurar os parâmetros de Repositório de Consultas.The following options are available to configure Query Store parameters.

OPERATION_MODEOPERATION_MODE
Pode ser READ_WRITE (padrão) ou READ_ONLY.Can be READ_WRITE (default) or READ_ONLY.

CLEANUP_POLICY (STALE_QUERY_THRESHOLD_DAYS)CLEANUP_POLICY (STALE_QUERY_THRESHOLD_DAYS)
Configure o argumento STALE_QUERY_THRESHOLD_DAYS para especificar o número de dias durante os quais os dados devem ser mantidos no Repositório de Consultas.Configure the STALE_QUERY_THRESHOLD_DAYS argument to specify the number of days to retain data in the Query Store. O valor padrão é 30.The default value is 30. Para o Banco de Dados SQLSQL Database Basic Edition, o padrão é 7 dias.For Banco de Dados SQLSQL Database Basic edition, default is 7 days.

DATA_FLUSH_INTERVAL_SECONDSDATA_FLUSH_INTERVAL_SECONDS
Determina a frequência na qual os dados gravados no Repositório de Consultas é persistida em disco.Determines the frequency at which data written to the Query Store is persisted to disk. Para otimizar o desempenho, os dados coletados pelo repositório de consultas são gravados de maneira assíncrona no disco.To optimize for performance, data collected by the query store is asynchronously written to the disk. A frequência em que essa transferência assíncrona ocorre é configurada via DATA_FLUSH_INTERVAL_SECONDS.The frequency at which this asynchronous transfer occurs is configured via DATA_FLUSH_INTERVAL_SECONDS. O valor padrão é 900 (15 min).The default value is 900 (15 min).

MAX_STORAGE_SIZE_MBMAX_STORAGE_SIZE_MB
Configura o tamanho máximo do Repositório de Consultas.Configures the maximum size of the Query Store. Se os dados no Repositório de Consultas atingirem o limite MAX_STORAGE_SIZE_MB, o Repositório de Consultas alterará automaticamente o estado de somente gravação para somente leitura e interromperá a coleta de novos dados.If the data in the Query Store hits the MAX_STORAGE_SIZE_MB limit, the Query Store automatically changes the state from read-write to read-only and stops collecting new data. O valor padrão é 100 MB para SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) ao SQL Server 2017 (14.x)SQL Server 2017 (14.x)).The default value is 100 MB for SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017 (14.x)SQL Server 2017 (14.x)). No SQL Server 2019 (15.x)SQL Server 2019 (15.x) em diante, o valor padrão é 1 GB.Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x), the default value is 1 GB. Para o Banco de Dados SQLSQL Database Premium Edition, o padrão é 1 GB e, para o Banco de Dados SQLSQL Database Basic Edition, o padrão é 10 MB.For Banco de Dados SQLSQL Database Premium edition, default is 1 GB and for Banco de Dados SQLSQL Database Basic edition, default is 10 MB.

INTERVAL_LENGTH_MINUTESINTERVAL_LENGTH_MINUTES
Determina o intervalo de tempo em que os dados de estatísticas de execução do runtime são agregados no Repositório de Consultas.Determines the time interval at which runtime execution statistics data is aggregated into the Query Store. Para otimizar o uso de espaço, as estatísticas de execução de tempo de execução no repositório de estatísticas de tempo de execução são agregadas em uma janela de tempo fixa.To optimize for space usage, the runtime execution statistics in the Runtime Stats Store are aggregated over a fixed time window. Essa janela de tempo fixa é configurada usando INTERVAL_LENGTH_MINUTES.This fixed time window is configured via INTERVAL_LENGTH_MINUTES. O valor padrão é 60.The default value is 60.

SIZE_BASED_CLEANUP_MODESIZE_BASED_CLEANUP_MODE
Controla se o processo de limpeza será ativado automaticamente quando o volume total de dados se aproximar do tamanho máximo.Controls whether the cleanup process will be automatically activated when total amount of data gets close to maximum size. Pode ser AUTO (padrão) ou OFF.Can be AUTO (default) or OFF.

QUERY_CAPTURE_MODEQUERY_CAPTURE_MODE
Indica se o Repositório de Consultas captura todas as consultas ou consultas relevantes com base no consumo de recursos e na contagem de execuções, ou se ele para de adicionar novas consultas e rastreia apenas as consultas atuais.Designates if the Query Store captures all queries, or relevant queries based on execution count and resource consumption, or stops adding new queries and just tracks current queries. Pode ser ALL (capturar todas as consultas), AUTO (ignorar incomum e consultas com duração de compilação e execução insignificante), CUSTOM (política de captura definida pelo usuário) ou NONE (parar de capturar novas consultas).Can be ALL (capture all queries), AUTO (ignore infrequent and queries with insignificant compile and execution duration), CUSTOM (user defined capture policy), or NONE (stop capturing new queries). O valor padrão é ALL para SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) ao SQL Server 2017 (14.x)SQL Server 2017 (14.x)).The default value is ALL for SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017 (14.x)SQL Server 2017 (14.x)). No SQL Server 2019 (15.x)SQL Server 2019 (15.x) em diante, o valor padrão é AUTO.Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x), the default value is AUTO. O valor padrão de Banco de dados SQL do AzureAzure SQL Database é AUTO.The default value for Banco de dados SQL do AzureAzure SQL Database is AUTO.

MAX_PLANS_PER_QUERYMAX_PLANS_PER_QUERY
Um número inteiro que representa a quantidade máxima de planos de manutenção para cada consulta.An integer representing the maximum number of plans maintained for each query. O valor padrão é 200.The default value is 200.

WAIT_STATS_CAPTURE_MODEWAIT_STATS_CAPTURE_MODE
Controla se o Repositório de Consultas captura informações de estatísticas de espera.Controls if Query Store captures wait statistics information. Pode ser OFF ou ON (padrão).Can be OFF or ON (default).

Consulte a exibição sys.database_query_store_options para determinar as opções atuais do Repositório de Consultas.Query the sys.database_query_store_options view to determine the current options of the Query Store. Para obter mais informações sobre os valores, consulte sys.database_query_store_options.For more information about the values, see sys.database_query_store_options.

Para obter mais informações sobre como definir opções usando instruções Transact-SQLTransact-SQL , consulte Gerenciamento de opção.For more information about setting options by using Transact-SQLTransact-SQL statements, see Option Management.

Exiba e gerencie o Repositório de Consultas por meio do Management StudioManagement Studio ou usando as exibições e os procedimentos a seguir.View and manage Query Store through Management StudioManagement Studio or by using the following views and procedures.

Funções do Repositório de ConsultasQuery Store Functions

As funções ajudam as operações com o Repositório de Consultas.Functions help operations with the Query Store.

sys.fn_stmt_sql_handle_from_sql_stmt (Transact-SQL)sys.fn_stmt_sql_handle_from_sql_stmt (Transact-SQL)

Exibições do catálogo de repositório de consultaQuery Store Catalog Views

As exibições do catálogo apresentam informações sobre o Repositório de Consultas.Catalog views present information about the Query Store.

sys.database_query_store_options (Transact-SQL)sys.database_query_store_options (Transact-SQL) sys.query_context_settings (Transact-SQL)sys.query_context_settings (Transact-SQL)
sys.query_store_plan (Transact-SQL)sys.query_store_plan (Transact-SQL) sys.query_store_query (Transact-SQL)sys.query_store_query (Transact-SQL)
sys.query_store_query_text (Transact-SQL)sys.query_store_query_text (Transact-SQL) sys.query_store_runtime_stats (Transact-SQL)sys.query_store_runtime_stats (Transact-SQL)
sys.query_store_wait_stats (Transact-SQL)sys.query_store_wait_stats (Transact-SQL) sys.query_store_runtime_stats_interval (Transact-SQL)sys.query_store_runtime_stats_interval (Transact-SQL)

Procedimentos armazenados do repositório de consultaQuery Store Stored Procedures

Os procedimentos armazenados configuram o Repositório de Consultas.Stored procedures configure the Query Store.

sp_query_store_flush_db (Transact-SQL)sp_query_store_flush_db (Transact-SQL) sp_query_store_reset_exec_stats (Transact-SQL)sp_query_store_reset_exec_stats (Transact-SQL)
sp_query_store_force_plan (Transact-SQL)sp_query_store_force_plan (Transact-SQL) sp_query_store_unforce_plan (Transact-SQL)sp_query_store_unforce_plan (Transact-SQL)
sp_query_store_remove_plan (Transct-SQL)sp_query_store_remove_plan (Transct-SQL) sp_query_store_remove_query (Transact-SQL)sp_query_store_remove_query (Transact-SQL)
sp_query_store_consistency_check (Transct-SQL)sp_query_store_consistency_check (Transct-SQL)

Principais cenários de usoKey Usage Scenarios

Gerenciamento de opçãoOption Management

Esta seção fornece algumas diretrizes sobre como gerenciar recursos do próprio repositório de consultas.This section provides some guidelines on managing Query Store feature itself.

O Repositório de Consultas está ativo no momento?Is Query Store currently active?

O Repositório de Consultas armazena seus dados dentro do banco de dados do usuário e é por isso que ele tem limite de tamanho (configurado com MAX_STORAGE_SIZE_MB).Query Store stores its data inside the user database and that is why it has size limit (configured with MAX_STORAGE_SIZE_MB). Se os dados no repositório de consultas atingirem esse limite, o repositório de consultas alterará automaticamente o status de somente gravação para somente leitura e interromperá a coleta de novos dados.If data in Query Store hits that limit Query Store will automatically change state from read-write to read-only and stop collecting new data.

Consulte sys.database_query_store_options para determinar se o Repositório de Consultas está ativo no momento e se está coletando estatísticas de tempo de execução ou não.Query sys.database_query_store_options to determine if Query Store is currently active, and whether it is currently collects runtime stats or not.

SELECT actual_state, actual_state_desc, readonly_reason,   
    current_storage_size_mb, max_storage_size_mb  
FROM sys.database_query_store_options;  

O status do Repositório de Consultas é determinado pela coluna actual_state.Query Store status is determined by actual_state column. Caso não seja o status desejado, a coluna readonly_reason pode fornecer mais informações.If it's different than the desired status, the readonly_reason column can give you more information.
Quando o tamanho do Repositório de Consultas exceder a cota, o recurso passará para o modo de readon_only.When Query Store size exceeds the quota, the feature will switch to readon_only mode.

Opções Obter Repositório de ConsultasGet Query Store options

Para obter informações detalhadas sobre o status do repositório de consultas, execute o seguinte em um banco de dados do usuário.To find out detailed information about Query Store status, execute following in a user database.

SELECT * FROM sys.database_query_store_options;  

Configurar o intervalo do Repositório de ConsultasSetting Query Store interval

Você pode substituir o intervalo para agregar estatísticas de tempo de execução de consulta (o padrão é 60 minutos).You can override interval for aggregating query runtime statistics (default is 60 minutes).

ALTER DATABASE <database_name>   
SET QUERY_STORE (INTERVAL_LENGTH_MINUTES = 15);  

Observação

Não são permitidos valores arbitrários para INTERVAL_LENGTH_MINUTES.Arbitrary values are not allowed for INTERVAL_LENGTH_MINUTES. Use um dos seguintes: 1, 5, 10, 15, 30, 60 ou 1.440 minutos.Use one of the following: 1, 5, 10, 15, 30, 60, or 1440 minutes.

O novo valor do intervalo é exposto por meio da exibição sys.database_query_store_options .New value for interval is exposed through sys.database_query_store_options view.

Uso de espaço do Repositório de ConsultasQuery Store space usage

Para verificar o tamanho atual e o limite do Repositório de Consultas, execute a instrução a seguir no banco de dados do usuário.To check current the Query Store size and limit execute the following statement in the user database.

SELECT current_storage_size_mb, max_storage_size_mb   
FROM sys.database_query_store_options;  

Se o armazenamento do repositório de consultas estiver completo, use a seguinte instrução para ampliar o armazenamento.If the Query Store storage is full use the following statement to extend the storage.

ALTER DATABASE <database_name>   
SET QUERY_STORE (MAX_STORAGE_SIZE_MB = <new_size>);  

Definir as opções do Repositório de ConsultasSet Query Store options

Você pode definir várias opções de repositório de consultas de uma só vez com uma única instrução ALTER DATABASE.You can set multiple Query Store options at once with a single ALTER DATABASE statement.

ALTER DATABASE <database name>   
SET QUERY_STORE (  
    OPERATION_MODE = READ_WRITE,  
    CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30),  
    DATA_FLUSH_INTERVAL_SECONDS = 3000,  
    MAX_STORAGE_SIZE_MB = 500,  
    INTERVAL_LENGTH_MINUTES = 15,  
    SIZE_BASED_CLEANUP_MODE = AUTO,  
    QUERY_CAPTURE_MODE = AUTO,  
    MAX_PLANS_PER_QUERY = 1000,
    WAIT_STATS_CAPTURE_MODE = ON 
);  

Para obter a lista completa de opções de configuração, confira Opções ALTER DATABASE SET (Transact-SQL).For the full list of configuration options, see ALTER DATABASE SET Options (Transact-SQL).

Limpar o espaçoCleaning up the space

Tabelas internas do repositório de consultas são criadas no grupo de arquivos PRIMARY durante a criação do banco de dados e essa configuração não pode ser alterada posteriormente.Query Store internal tables are created in the PRIMARY filegroup during database creation and that configuration cannot be changed later. Se você estiver executando sem espaço, limpe os dados antigos do repositório de consultas usando a instrução a seguir.If you are running out of space you might want to clear older Query Store data by using the following statement.

ALTER DATABASE <db_name> SET QUERY_STORE CLEAR;  

Você pode também limpar apenas dados de consulta ad hoc, pois são menos relevantes para otimizações de consulta e análise do plano, mas eles ocupam a mesma quantidade de espaço.Alternatively, you might want to clear up only ad-hoc query data, since it is less relevant for query optimizations and plan analysis but takes up just as much space.

Excluir consultas ad hocDelete ad-hoc queries

Isso exclui as consultas que só foram executadas uma vez e que têm mais de 24 horas.This deletes the queries that were only executed only once and that are more than 24 hours old.

DECLARE @id int  
DECLARE adhoc_queries_cursor CURSOR   
FOR   
SELECT q.query_id  
FROM sys.query_store_query_text AS qt  
JOIN sys.query_store_query AS q   
    ON q.query_text_id = qt.query_text_id  
JOIN sys.query_store_plan AS p   
    ON p.query_id = q.query_id  
JOIN sys.query_store_runtime_stats AS rs   
    ON rs.plan_id = p.plan_id  
GROUP BY q.query_id  
HAVING SUM(rs.count_executions) < 2   
AND MAX(rs.last_execution_time) < DATEADD (hour, -24, GETUTCDATE())  
ORDER BY q.query_id ;  
  
OPEN adhoc_queries_cursor ;  
FETCH NEXT FROM adhoc_queries_cursor INTO @id;  
WHILE @@fetch_status = 0  
    BEGIN   
        PRINT @id  
        EXEC sp_query_store_remove_query @id  
        FETCH NEXT FROM adhoc_queries_cursor INTO @id  
    END   
CLOSE adhoc_queries_cursor ;  
DEALLOCATE adhoc_queries_cursor;  

Você pode definir seu próprio procedimento com uma lógica diferente para limpar os dados que não são mais necessários.You can define your own procedure with different logic for clearing up data you no longer want.

O exemplo acima usa o procedimento armazenado estendido sp_query_store_remove_query para remover dados desnecessários.The example above uses the sp_query_store_remove_query extended stored procedure for removing unnecessary data. Você também pode usar:You can also use:

  • sp_query_store_reset_exec_stats para limpar as estatísticas de tempo de execução para um plano específico.sp_query_store_reset_exec_stats to clear runtime statistics for a given plan.
  • sp_query_store_remove_plan para remover um único plano.sp_query_store_remove_plan to remove a single plan.

Auditoria e solução de problemas de desempenhoPerformance Auditing and Troubleshooting

O Repositório de Consultas mantém um histórico das métricas de compilação e de tempo de execução durante as execuções de consulta, permitindo que você faça perguntas sobre sua carga de trabalho.Query Store keeps a history of compilation and runtime metrics throughout query executions, allowing you to ask questions about your workload.

Últimas n consultas executadas no banco de dados?Last n queries executed on the database?

SELECT TOP 10 qt.query_sql_text, q.query_id,   
    qt.query_text_id, p.plan_id, rs.last_execution_time  
FROM sys.query_store_query_text AS qt   
JOIN sys.query_store_query AS q   
    ON qt.query_text_id = q.query_text_id   
JOIN sys.query_store_plan AS p   
    ON q.query_id = p.query_id   
JOIN sys.query_store_runtime_stats AS rs   
    ON p.plan_id = rs.plan_id  
ORDER BY rs.last_execution_time DESC;  

Número de execuções de cada consulta?Number of executions for each query?

SELECT q.query_id, qt.query_text_id, qt.query_sql_text,   
    SUM(rs.count_executions) AS total_execution_count  
FROM sys.query_store_query_text AS qt   
JOIN sys.query_store_query AS q   
    ON qt.query_text_id = q.query_text_id   
JOIN sys.query_store_plan AS p   
    ON q.query_id = p.query_id   
JOIN sys.query_store_runtime_stats AS rs   
    ON p.plan_id = rs.plan_id  
GROUP BY q.query_id, qt.query_text_id, qt.query_sql_text  
ORDER BY total_execution_count DESC;  

O número de consultas com o tempo médio de execução mais longo na última hora?The number of queries with the longest average execution time within last hour?

SELECT TOP 10 rs.avg_duration, qt.query_sql_text, q.query_id,  
    qt.query_text_id, p.plan_id, GETUTCDATE() AS CurrentUTCTime,   
    rs.last_execution_time   
FROM sys.query_store_query_text AS qt   
JOIN sys.query_store_query AS q   
    ON qt.query_text_id = q.query_text_id   
JOIN sys.query_store_plan AS p   
    ON q.query_id = p.query_id   
JOIN sys.query_store_runtime_stats AS rs   
    ON p.plan_id = rs.plan_id  
WHERE rs.last_execution_time > DATEADD(hour, -1, GETUTCDATE())  
ORDER BY rs.avg_duration DESC;  

O número de consultas que tiveram a maior média de leituras físicas de E/S nas últimas 24 horas, com a média de contagem de linhas e execuções correspondente?The number of queries that had the biggest average physical I/O reads in last 24 hours, with corresponding average row count and execution count?

SELECT TOP 10 rs.avg_physical_io_reads, qt.query_sql_text,   
    q.query_id, qt.query_text_id, p.plan_id, rs.runtime_stats_id,   
    rsi.start_time, rsi.end_time, rs.avg_rowcount, rs.count_executions  
FROM sys.query_store_query_text AS qt   
JOIN sys.query_store_query AS q   
    ON qt.query_text_id = q.query_text_id   
JOIN sys.query_store_plan AS p   
    ON q.query_id = p.query_id   
JOIN sys.query_store_runtime_stats AS rs   
    ON p.plan_id = rs.plan_id   
JOIN sys.query_store_runtime_stats_interval AS rsi   
    ON rsi.runtime_stats_interval_id = rs.runtime_stats_interval_id  
WHERE rsi.start_time >= DATEADD(hour, -24, GETUTCDATE())   
ORDER BY rs.avg_physical_io_reads DESC;  

Consultas com vários planos?Queries with multiple plans? Essas consultas são especialmente interessantes porque são candidatas a regressões em razão de alteração na escolha do plano.These queries are especially interesting because they are candidates for regressions due to plan choice change. A consulta a seguir identifica essas consultas junto com todos os planos:The following query identifies these queries along with all plans:

WITH Query_MultPlans  
AS  
(  
SELECT COUNT(*) AS cnt, q.query_id   
FROM sys.query_store_query_text AS qt  
JOIN sys.query_store_query AS q  
    ON qt.query_text_id = q.query_text_id  
JOIN sys.query_store_plan AS p  
    ON p.query_id = q.query_id  
GROUP BY q.query_id  
HAVING COUNT(distinct plan_id) > 1  
)  
  
SELECT q.query_id, object_name(object_id) AS ContainingObject,   
    query_sql_text, plan_id, p.query_plan AS plan_xml,  
    p.last_compile_start_time, p.last_execution_time  
FROM Query_MultPlans AS qm  
JOIN sys.query_store_query AS q  
    ON qm.query_id = q.query_id  
JOIN sys.query_store_plan AS p  
    ON q.query_id = p.query_id  
JOIN sys.query_store_query_text qt   
    ON qt.query_text_id = q.query_text_id  
ORDER BY query_id, plan_id;  

Consultas com regressão recente de desempenho (comparando diferentes pontos no tempo)?Queries that recently regressed in performance (comparing different point in time)? O exemplo de consulta a seguir retorna todas as consultas para as quais o tempo de execução dobrou nas últimas 48 horas em razão de alteração na escolha do plano.The following query example returns all queries for which execution time doubled in last 48 hours due to a plan choice change. A consulta compara todos os intervalos de estatísticas de tempo de execução lado a lado.Query compares all runtime stat intervals side by side.

SELECT   
    qt.query_sql_text,   
    q.query_id,   
    qt.query_text_id,   
    rs1.runtime_stats_id AS runtime_stats_id_1,  
    rsi1.start_time AS interval_1,   
    p1.plan_id AS plan_1,   
    rs1.avg_duration AS avg_duration_1,   
    rs2.avg_duration AS avg_duration_2,  
    p2.plan_id AS plan_2,   
    rsi2.start_time AS interval_2,   
    rs2.runtime_stats_id AS runtime_stats_id_2  
FROM sys.query_store_query_text AS qt   
JOIN sys.query_store_query AS q   
    ON qt.query_text_id = q.query_text_id   
JOIN sys.query_store_plan AS p1   
    ON q.query_id = p1.query_id   
JOIN sys.query_store_runtime_stats AS rs1   
    ON p1.plan_id = rs1.plan_id   
JOIN sys.query_store_runtime_stats_interval AS rsi1   
    ON rsi1.runtime_stats_interval_id = rs1.runtime_stats_interval_id   
JOIN sys.query_store_plan AS p2   
    ON q.query_id = p2.query_id   
JOIN sys.query_store_runtime_stats AS rs2   
    ON p2.plan_id = rs2.plan_id   
JOIN sys.query_store_runtime_stats_interval AS rsi2   
    ON rsi2.runtime_stats_interval_id = rs2.runtime_stats_interval_id  
WHERE rsi1.start_time > DATEADD(hour, -48, GETUTCDATE())   
    AND rsi2.start_time > rsi1.start_time   
    AND p1.plan_id <> p2.plan_id  
    AND rs2.avg_duration > 2*rs1.avg_duration  
ORDER BY q.query_id, rsi1.start_time, rsi2.start_time;  

Para ver todas as regressões de desempenho (não apenas as relacionadas a alteração na escolha do plano), basta remover a condição AND p1.plan_id <> p2.plan_id da consulta anterior.If you want to see performance all regressions (not only those related to plan choice change) than just remove condition AND p1.plan_id <> p2.plan_id from the previous query.

Consultas que estão aguardando mais?Queries that are waiting the most? Essa consulta retornará as dez principais consultas que mais esperam.This query will return top 10 queries that wait the most.

 SELECT TOP 10
   qt.query_text_id,
   q.query_id,
   p.plan_id,
   sum(total_query_wait_time_ms) AS sum_total_wait_ms
FROM sys.query_store_wait_stats ws
JOIN sys.query_store_plan p ON ws.plan_id = p.plan_id
JOIN sys.query_store_query q ON p.query_id = q.query_id
JOIN sys.query_store_query_text qt ON q.query_text_id = qt.query_text_id
GROUP BY qt.query_text_id, q.query_id, p.plan_id
ORDER BY sum_total_wait_ms DESC

Consultas com regressão recente de desempenho (comparando execuções recentes e históricas)?Queries that recently regressed in performance (comparing recent vs. history execution)? A próxima consulta compara os períodos de execução baseados na execução da consulta.The next query compares query execution based periods of execution. Nesse exemplo específico, a consulta compara a execução no período recente (uma hora) com o período do histórico (último dia) e identifica as que introduziram o additional_duration_workload.In this particular example the query compares execution in recent period (1 hour) vs. history period (last day) and identifies those that introduced additional_duration_workload. Essa métrica é calculada como uma diferença entre a média de execução recente e a média de execução do histórico, multiplicado pelo número de execuções recentes.This metrics is calculated as a difference between recent average execution and history average execution multiplied by the number of recent executions. Representa, na verdade, quanto de duração adicional as execuções recentes introduziram em comparação com histórico:It actually represents how much of additional duration recent executions introduced compared to history:

--- "Recent" workload - last 1 hour  
DECLARE @recent_start_time datetimeoffset;  
DECLARE @recent_end_time datetimeoffset;  
SET @recent_start_time = DATEADD(hour, -1, SYSUTCDATETIME());  
SET @recent_end_time = SYSUTCDATETIME();  
  
--- "History" workload  
DECLARE @history_start_time datetimeoffset;  
DECLARE @history_end_time datetimeoffset;  
SET @history_start_time = DATEADD(hour, -24, SYSUTCDATETIME());  
SET @history_end_time = SYSUTCDATETIME();  
  
WITH  
hist AS  
(  
    SELECT   
        p.query_id query_id,   
        CONVERT(float, SUM(rs.avg_duration*rs.count_executions)) total_duration,   
        SUM(rs.count_executions) count_executions,  
        COUNT(distinct p.plan_id) num_plans   
     FROM sys.query_store_runtime_stats AS rs  
        JOIN sys.query_store_plan p ON p.plan_id = rs.plan_id  
    WHERE  (rs.first_execution_time >= @history_start_time   
               AND rs.last_execution_time < @history_end_time)  
        OR (rs.first_execution_time <= @history_start_time   
               AND rs.last_execution_time > @history_start_time)  
        OR (rs.first_execution_time <= @history_end_time   
               AND rs.last_execution_time > @history_end_time)  
    GROUP BY p.query_id  
),  
recent AS  
(  
    SELECT   
        p.query_id query_id,   
        CONVERT(float, SUM(rs.avg_duration*rs.count_executions)) total_duration,   
        SUM(rs.count_executions) count_executions,  
        COUNT(distinct p.plan_id) num_plans   
    FROM sys.query_store_runtime_stats AS rs  
        JOIN sys.query_store_plan p ON p.plan_id = rs.plan_id  
    WHERE  (rs.first_execution_time >= @recent_start_time   
               AND rs.last_execution_time < @recent_end_time)  
        OR (rs.first_execution_time <= @recent_start_time   
               AND rs.last_execution_time > @recent_start_time)  
        OR (rs.first_execution_time <= @recent_end_time   
               AND rs.last_execution_time > @recent_end_time)  
    GROUP BY p.query_id  
)  
SELECT   
    results.query_id query_id,  
    results.query_text query_text,  
    results.additional_duration_workload additional_duration_workload,  
    results.total_duration_recent total_duration_recent,  
    results.total_duration_hist total_duration_hist,  
    ISNULL(results.count_executions_recent, 0) count_executions_recent,  
    ISNULL(results.count_executions_hist, 0) count_executions_hist   
FROM  
(  
    SELECT  
        hist.query_id query_id,  
        qt.query_sql_text query_text,  
        ROUND(CONVERT(float, recent.total_duration/  
                   recent.count_executions-hist.total_duration/hist.count_executions)  
               *(recent.count_executions), 2) AS additional_duration_workload,  
        ROUND(recent.total_duration, 2) total_duration_recent,   
        ROUND(hist.total_duration, 2) total_duration_hist,  
        recent.count_executions count_executions_recent,  
        hist.count_executions count_executions_hist     
    FROM hist   
        JOIN recent   
            ON hist.query_id = recent.query_id   
        JOIN sys.query_store_query AS q   
            ON q.query_id = hist.query_id  
        JOIN sys.query_store_query_text AS qt   
            ON q.query_text_id = qt.query_text_id      
) AS results  
WHERE additional_duration_workload > 0  
ORDER BY additional_duration_workload DESC  
OPTION (MERGE JOIN);  

Como manter a estabilidade do desempenho da consultaMaintaining query performance stability

Para consultas executadas várias vezes, você pode perceber que o SQL ServerSQL Server usa diferentes planos, resultando em diferentes utilizações de recurso e duração.For queries executed multiple times you may notice that SQL ServerSQL Server uses different plans, resulting in different resource utilization and duration. Com o Repositório de Consultas, você pode detectar quando o desempenho da consulta regrediu e determinar o plano ideal dentro de um período de interesse.With Query Store you can detect when query performance regressed and determine the optimal plan within a period of interest. Em seguida, você pode impor esse plano ideal para execução futura da consulta.You can then force that optimal plan for future query execution.

Você também pode identificar desempenho inconsistente de consulta para uma consulta com parâmetros (autoparametrizada ou parametrizada manualmente).You can also identify inconsistent query performance for a query with parameters (either auto-parameterized or manually parameterized). Entre diferentes planos, você pode identificar o plano que é rápido e ideal o suficiente para todos ou a maioria dos valores de parâmetro e impor esse plano, mantendo desempenho previsível para o conjunto mais amplo de cenários de usuário.Among different plans you can identify the plan which is fast and optimal enough for all or most of the parameter values and force that plan, keeping predictable performance for the wider set of user scenarios.

Impor um plano para uma consulta (aplicar política de imposição)Force a plan for a query (apply forcing policy)

Quando um plano é imposto em determinada consulta, SQL ServerSQL Server tenta impor o plano no otimizador.When a plan is forced for a certain query, SQL ServerSQL Server tries to force the plan in the optimizer. Se a imposição do plano falhar, um XEvent será acionado e o otimizador será instruído a otimizar normalmente.If plan forcing fails, an XEvent is fired and the optimizer is instructed to optimize in the normal way.

EXEC sp_query_store_force_plan @query_id = 48, @plan_id = 49;  

Ao usar sp_query_store_force_plan você só pode impor planos registrados pelo repositório de consultas como um plano para essa consulta.When using sp_query_store_force_plan you can only force plans that were recorded by Query Store as a plan for that query. Em outras palavras, os únicos planos disponíveis para uma consulta são aqueles que já foram usados para executar essa consulta enquanto o Repositório de Consultas estava ativo.In other words, the only plans available for a query are those that were already used to execute that query while Query Store was active.

Planejar forçar suporte para cursores estáticos e de avanço rápido Plan forcing support for fast forward and static cursors

No SQL Server 2019 (15.x)SQL Server 2019 (15.x) CTP 2.3 em diante, o Repositório de Consultas dá suporte à capacidade de impor planos de execução de consulta para cursores estáticos e de avanço rápido de API e Transact-SQLTransact-SQL.Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x) CTP 2.3, the Query Store supports the ability to force query execution plans for fast forward and static Transact-SQLTransact-SQL and API cursors. Há suporte para a imposição por meio de SQL Server Management StudioSQL Server Management Studio ou dos relatórios do Repositório de Consultas do sp_query_store_force_plan.Forcing is supported via sp_query_store_force_plan or through SQL Server Management StudioSQL Server Management Studio Query Store reports.

Remover a imposição de plano de uma consultaRemove plan forcing for a query

Para depender novamente no otimizador de consultas do SQL ServerSQL Server para calcular o plano de consulta ideal, use sp_query_store_unforce_plan para cancelar a imposição do plano selecionado para a consulta.To rely again on the SQL ServerSQL Server query optimizer to calculate the optimal query plan, use sp_query_store_unforce_plan to unforce the plan that was selected for the query.

EXEC sp_query_store_unforce_plan @query_id = 48, @plan_id = 49;  

Consulte TambémSee Also

Prática recomendada com o Repositório de Consultas Best Practice with the Query Store
Usar o Repositório de Consultas com OLTP na memória Using the Query Store with In-Memory OLTP
Cenários de uso do Repositório de Consultas Query Store Usage Scenarios
Como o Repositório de Consultas coleta dados How Query Store Collects Data
Procedimentos armazenados do Repositório de Consultas (Transact-SQL) Query Store Stored Procedures (Transact-SQL)
Exibições de Catálogo do Repositório de Consultas (Transact-SQL) Query Store Catalog Views (Transact-SQL)
Monitorar e ajustar o desempenho Monitor and Tune for Performance
Ferramentas para monitoramento e ajuste de desempenho Performance Monitoring and Tuning Tools
Abrir o Monitor de Atividade (SQL Server Management Studio) Open Activity Monitor (SQL Server Management Studio)
Estatísticas de consulta dinâmica Live Query Statistics
Monitor de atividade Activity Monitor
sys.database_query_store_options (Transact-SQL)sys.database_query_store_options (Transact-SQL)
Operar o Repositório de Consultas no banco de dados SQL do AzureOperating the Query Store in Azure SQL Database