sys.query_store_plan (Transact-SQL)

Aplica-se a: SQL Server 2016 (13.x) e posterior Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics

Contém informações sobre cada plano de execução associado a uma consulta.

Nome da coluna Tipo de dados Descrição
plan_id bigint Chave primária.
query_id bigint Chave estrangeira. Une-se ao sys.query_store_query (Transact-SQL).
plan_group_id bigint ID do grupo de planos. As consultas de cursor normalmente exigem vários planos (popular e buscar). Popular e buscar planos que são compilados juntos estão no mesmo grupo.

0 significa que o plano não está em um grupo.
engine_version nvarchar(32) Versão do motor usado para compilar o plano em <major>.<minor>.<build>.<revision> formato.
compatibility_level smallint Nível de compatibilidade do banco de dados referenciado na consulta.
query_plan_hash binary(8) Hash MD5 do plano individual.
query_plan nvarchar(max) Plano de execução XML do plano de consulta.
is_online_index_plan bit O plano foi usado durante um build de índice online.

Observação: o Azure Synapse Analytics sempre retorna 0.
is_trivial_plan bit O plano é um plano trivial (saída na fase 0 do otimizador de consulta).

Observação: o Azure Synapse Analytics sempre retorna 0.
is_parallel_plan bit O plano é paralelo.

Observação: o Azure Synapse Analytics sempre retorna 1.
is_forced_plan bit O plano é marcado como forçado quando o usuário executa o procedimento sys.sp_query_store_force_planarmazenado. O mecanismo de imposição não garante que esse plano exato será usado para a consulta referenciada pelo query_id. A imposição de plano faz com que a consulta seja compilada novamente e normalmente produz exatamente o mesmo plano ou um plano semelhante ao plano referenciado pelo plan_id. Se a imposição de plano não for bem-sucedida, force_failure_count será incrementada e last_force_failure_reason preenchida com o motivo da falha.

Observação: o Azure Synapse Analytics sempre retorna 0.
is_natively_compiled bit O plano inclui procedimentos otimizados para memória compilados nativamente. (0 = FALSE, 1 = TRUE).

Observação: o Azure Synapse Analytics sempre retorna 0.
force_failure_count bigint Número de vezes que a forçagem desse plano falhou. Ele só pode ser incrementado quando a consulta é recompilada (não em todas as execuções). Redefine para 0 cada vez que is_plan_forced é alterado de FALSE para TRUE.

Observação: o Azure Synapse Analytics sempre retorna 0.
last_force_failure_reason int Motivo pelo qual a forçagem do plano falhou.

0: sem falha, caso contrário, o número do erro que causou a falha da forçagem
3617: COMPILATION_ABORTED_BY_CLIENT
8637: ONLINE_INDEX_BUILD
8675: OPTIMIZATION_REPLAY_FAILED
8683: INVALID_STARJOIN
8684: TIME_OUT
8689: NO_DB
8690: HINT_CONFLICT
8691: SETOPT_CONFLICT
8694: DQ_NO_FORCING_SUPPORTED
8698: NO_PLAN
8712: NO_INDEX
8713: VIEW_COMPILE_FAILED
<O outro valor>: GENERAL_FAILURE

Observação: o Azure Synapse Analytics sempre retorna 0.
last_force_failure_reason_desc nvarchar(128) Descrição textual de last_force_failure_reason.

COMPILATION_ABORTED_BY_CLIENT: compilação de consulta abortada pelo cliente antes de ser concluída
ONLINE_INDEX_BUILD: tenta modificar os dados enquanto a tabela de destino tem um índice que está sendo criado online
OPTIMIZATION_REPLAY_FAILED: Falha ao executar o script de reprodução de otimização.
INVALID_STARJOIN: o plano contém uma especificação StarJoin inválida
TIME_OUT: O otimizador excedeu o número de operações permitidas ao pesquisar o plano especificado pelo plano forçado
NO_DB: Não existe um banco de dados especificado no plano
HINT_CONFLICT: A consulta não pode ser compilada porque o plano está em conflito com uma dica de consulta
DQ_NO_FORCING_SUPPORTED: não é possível executar a consulta porque o plano entra em conflito com o uso de consulta distribuída ou operações de texto completo.
NO_PLAN: O processador de consultas não pôde produzir o plano de consulta, pois o plano forçado não pôde ser verificado como válido para a consulta
NO_INDEX: O índice especificado no plano não existe mais
VIEW_COMPILE_FAILED: Não foi possível forçar o plano de consulta devido a um problema em uma exibição indexada referenciada no plano
GENERAL_FAILURE: erro de força geral (não coberto por outros motivos)

Observação: o Azure Synapse Analytics sempre retorna NONE.
count_compiles bigint Planejar estatísticas de compilação.
initial_compile_start_time datetimeoffset Planejar estatísticas de compilação.
last_compile_start_time datetimeoffset Planejar estatísticas de compilação.
last_execution_time datetimeoffset O último tempo de execução se refere à última hora de término da consulta/plano.
avg_compile_duration float Planeje estatísticas de compilação, em microssegundos. Divida por 1.000.000 para obter segundos.
last_compile_duration bigint Planeje estatísticas de compilação, em microssegundos. Divida por 1.000.000 para obter segundos.
plan_forcing_type int Aplica-se a: SQL Server 2017 (14.x) e versões posteriores

Tipo de forçagem de plano.

0: NONE
1: MANUAL
2: AUTO
plan_forcing_type_desc nvarchar(60) Aplica-se a: SQL Server 2017 (14.x) e versões posteriores

Descrição do texto de plan_forcing_type.

NONE: Sem forçar o plano
MANUAL: Plano forçado pelo usuário
AUTO: Plano forçado por sintonia automática.
has_compile_replay_script bit Aplica-se a: SQL Server 2022 (16.x) e versões posteriores

Indica se o plano tem um script de reprodução de otimização associado a ele:
0 = nenhum script de reprodução de otimização (nenhum ou até mesmo inválido).
1 = script de reprodução de otimização registrado.

Não aplicável ao Azure Synapse Analytics.
is_optimized_plan_forcing_disabled bit Aplica-se a: SQL Server 2022 (16.x) e versões posteriores

Indica se a forçagem do plano otimizada foi desabilitada para o plano:
0 = desabilitado.
1 = não desabilitado.

Não aplicável ao Azure Synapse Analytics.
plan_type int Aplica-se a: SQL Server 2022 (16.x) e versões posteriores

Tipo de plano.
0: Plano Compilado
1: Plano do Despachante
2: Plano de Variante de Consulta

Não aplicável ao Azure Synapse Analytics.
plan_type_desc nvarchar(120) Aplica-se a: SQL Server 2022 (16.x) e versões posteriores

Descrição de texto do tipo de plano.
Plano compilado: indica que o plano é um plano otimizado para plano não sensível a parâmetros
Plano do Dispatcher: Indica que o plano é um plano do Dispatcher otimizado para o plano sensível a parâmetros
Plano de Variante de Consulta: indica que o plano é um plano de variante de consulta otimizado para plano sensível a parâmetros

Não aplicável ao Azure Synapse Analytics.

Comentários

Mais de um plano pode ser forçado quando o Repositório de Consultas para réplicas secundárias está habilitado.

No Azure Synapse Analytics, o uso de colunas has_compile_replay_script, is_optimized_plan_forcing_disabled, plan_type, plan_type_desc resulta em um Invalid Column Name erro, pois não há suporte para elas. Consulte o Exemplo B para obter um exemplo de como usar sys.query_store_plan no Azure Synapse Analytics.

Limitações forçadas do plano

O Repositório de Consultas tem um mecanismo para forçar o otimizador de consulta a usar um determinado plano de execução. No entanto, existem algumas limitações que podem impedir que um plano seja forçado.

Primeiro, se o plano contém as seguintes construções:

  • Inserir instrução em massa
  • Referência a uma tabela externa
  • Consulta distribuída ou operações de texto completo
  • Uso de consultas elásticas
  • Cursores dinâmicos ou de conjunto de chaves
  • Especificação de junção em estrela inválida

Observação

O Banco de Dados SQL do Azure e o SQL Server 2019 e versões de build posteriores dão suporte à imposição de plano para cursores estáticos e de avanço rápido.

Segundo, quando os objetos dos quais o plano depende, não estão mais disponíveis:

  • Banco de dados (se o banco de dados, onde o plano foi originado, não existir mais)
  • Índice (não existe mais ou está desabilitado)

Por fim, problemas com o próprio plano:

  • Não é válido para consulta
  • O otimizador de consulta excedeu o número de operações permitidas
  • XML do plano formatado incorretamente

Permissões

Requer a permissão VIEW DATABASE STATE.

Exemplos

R. Encontrar o motivo pelo qual o SQL Server não pôde forçar um plano por meio do QDS

Preste atenção às last_force_failure_reason_desc colunas e force_failure_count :

SELECT TOP 1000
    p.query_id,
    p.plan_id,
    p.last_force_failure_reason_desc,
    p.force_failure_count,
    p.last_compile_start_time,
    p.last_execution_time,
    q.last_bind_duration,
    q.query_parameterization_type_desc,
    q.context_settings_id,
    c.set_options,
    c.STATUS
FROM sys.query_store_plan p
INNER JOIN sys.query_store_query q
    ON p.query_id = q.query_id
INNER JOIN sys.query_context_settings c
    ON c.context_settings_id = q.context_settings_id
LEFT JOIN sys.query_store_query_text t
    ON q.query_text_id = t.query_text_id
WHERE p.is_forced_plan = 1
    AND p.last_force_failure_reason != 0;

B. Consulta para exibir os resultados do plano de consulta no Azure Synapse Analytics

Use a consulta de exemplo a seguir para localizar os 100 planos de execução mais recentes no Repositório de Consultas no Azure Synapse Analytics.

SELECT TOP 100
    plan_id,
    query_id,
    plan_group_id,
    engine_version,
    compatibility_level,
    query_plan_hash,
    query_plan,
    is_online_index_plan,
    is_trivial_plan,
    is_parallel_plan,
    is_forced_plan,
    is_natively_compiled,
    force_failure_count,
    last_force_failure_reason,
    last_force_failure_reason_desc,
    count_compiles,
    initial_compile_start_time,
    last_compile_start_time,
    last_execution_time,
    avg_compile_duration,
    last_compile_duration,
    plan_forcing_type,
    plan_forcing_type_desc
FROM sys.query_store_plan
ORDER BY last_execution_time DESC;