Partilhar via


sys.dm_exec_plan_attributes (Transact-SQL)

Aplica-se a: SQL Server 2016 (13.x) e versões posteriores Azure SQL Database AzureSQL Managed InstanceSQL database in Microsoft Fabric

Devolve uma linha por atributo do plano para o plano especificado pelo handle do plano. Pode usar esta função de valores de tabela para obter detalhes sobre um plano particular, como os valores das chaves de cache ou o número de execuções simultâneas atuais do plano.

Observação

Alguma da informação devolvida através desta função corresponde à vista de compatibilidade retroativa sys.syscacheobjects .

Sintaxe

sys.dm_exec_plan_attributes ( plan_handle )  

Arguments

plan_handle
Identifica de forma única um plano de consulta para um lote que foi executado e cujo plano reside na cache do plano. plan_handle é varbinary(64). A alavanca do plano pode ser obtida a partir da sys.dm_exec_cached_plans vista de gestão dinâmica.

Tabela retornada

Nome da coluna Tipo de dados Description
atributo Varchar(128) Nome do atributo associado a este plano. A tabela imediatamente abaixo desta lista lista os atributos possíveis, os seus tipos de dados e as suas descrições.
valor sql_variant Valor do atributo associado a este plano.
is_cache_key bit Indica se o atributo é usado como parte da chave de pesquisa de cache para o plano.

A partir da tabela acima, o atributo pode ter os seguintes valores:

Attribute Tipo de dados Description
set_options int Indica os valores das opções com que o plano foi compilado.
Objectid int Uma das principais chaves usadas para procurar um objeto na cache. Este é o ID do objeto armazenado nos sys.objects para objetos da base de dados (procedimentos, vistas, triggers, etc.). Para planos do tipo "Adhoc" ou "Preparado", é um hash interno do texto do lote.
Dbid int É o ID da base de dados que contém a entidade a que o plano se refere.

Para planos ad hoc ou preparados, é o ID da base de dados a partir do qual o lote é executado.
dbid_execute int Para objetos do sistema armazenados na base de dados de Recursos , o ID da base de dados a partir do qual o plano em cache é executado. Para todos os outros casos, é 0.
ID de utilizador int O valor de -2 indica que o lote submetido não depende da resolução implícita do nome e pode ser partilhado entre diferentes utilizadores. Este é o método preferido. Qualquer outro valor representa o ID de utilizador do utilizador que submete a consulta na base de dados.
language_id smallint ID da linguagem da ligação que criou o objeto cache. Para obter mais informações, consulte sys.syslanguages (Transact-SQL).
date_format smallint Formato de data da ligação que criou o objeto cache. Para obter mais informações, consulte SET DATEFORMAT (Transact-SQL).
date_first tinyint Valor de encontro primeiro. Para obter mais informações, consulte SET DATEFIRST (Transact-SQL).
compat_level tinyint Representa o nível de compatibilidade definido na base de dados em cujo contexto o plano de consulta foi compilado. O nível de compatibilidade devolvido é o nível de compatibilidade do contexto atual da base de dados para instruções ad hoc, e não é afetado pela QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n de dicas de consulta. Para instruções contidas num procedimento ou função armazenada, corresponde ao nível de compatibilidade da base de dados onde o procedimento ou função armazenada é criado.
estado int Bits de estado internos que fazem parte da chave de pesquisa de cache.
required_cursor_options int Opções de cursor especificadas pelo usuário, como o tipo de cursor.
acceptable_cursor_options int Opções de cursor para as quais o SQL Server pode converter implicitamente para dar suporte à execução da instrução. Por exemplo, o utilizador pode especificar um cursor dinâmico, mas o otimizador de consultas pode converter esse tipo de cursor num cursor estático.
merge_action_type smallint O tipo de plano de execução de gatilho utilizado como resultado de uma instrução MERGE.

0 indica um plano sem trigger, um plano trigger que não é executado como resultado de uma instrução MERGE, ou um plano trigger que é executado como resultado de uma instrução MERGE que especifica apenas uma ação DELETE.

1 indica um plano de trigger INSERT que é executado como resultado de uma instrução MERGE.

2 indica um plano de trigger UPDATE que é executado como resultado de uma instrução MERGE.

3 indica um plano de gatilho DELETE que é executado como resultado de uma instrução MERGE contendo uma ação INSERT ou UPDATE correspondente.

Para gatilhos aninhados executados por ações em cascata, este valor é a ação da instrução MERGE que causou a cascata.
is_replication_specific int Representa que a sessão a partir da qual este plano foi compilado é aquela que se conectou à instância do SQL Server usando uma propriedade de ligação não documentada que permite ao servidor identificar a sessão como criada por componentes de replicação, de modo que o comportamento de certos aspetos funcionais do servidor é alterado de acordo com o que esse componente de replicação espera.
optional_spid smallint O session_id de ligação (spid) torna-se parte da chave de cache para reduzir o número de recompilações. Isto impede recompilações para a reutilização de um plano por uma única sessão envolvendo tabelas temporárias não ligadas dinamicamente.
optional_clr_trigger_dbid int Apenas preenchido no caso de um gatilho DML CLR. O ID da base de dados que contém a entidade.

Para qualquer outro tipo de objeto, retorna zero.
optional_clr_trigger_objid int Apenas preenchido no caso de um gatilho DML CLR. O ID do objeto armazenado em sys.objects.

Para qualquer outro tipo de objeto, retorna zero.
parent_plan_handle varbinary(64) Sempre NULL.
is_azure_user_plan tinyint 1 para consultas executadas numa base de dados Azure SQL a partir de uma sessão iniciada por um utilizador.

0 para consultas executadas a partir de uma sessão não iniciada por um utilizador final, mas por aplicações a correr dentro da infraestrutura Azure que emitem consultas para outros fins de recolha de telemetria ou execução de tarefas administrativas. Os clientes não são cobrados pelos recursos consumidos por consultas onde is_azure_user_plan = 0.

Apenas Azure SQL Database .
inuse_exec_context int Número de lotes atualmente em execução que estão a usar o plano de consulta.
free_exec_context int Número de contextos de execução em cache para o plano de consulta que não estão a ser usados atualmente.
hits_exec_context int Várias vezes o contexto de execução foi obtido da cache do plano e reutilizado, poupando a sobrecarga de recompilar a instrução SQL. O valor é um agregado de todas as execuções em lote até agora.
misses_exec_context int Número de vezes em que um contexto de execução não foi encontrado no cache plano, resultando na criação de um novo contexto de execução para a execução em lote.
removed_exec_context int Número de contextos de execução que foram removidos devido à pressão de memória no plano em cache.
inuse_cursors int Número de lotes atualmente em execução contendo um ou mais cursores que estão a usar o plano em cache.
free_cursors int Número de cursores inativos ou livres para o plano em cache.
hits_cursors int Número de vezes em que um cursor inativo foi obtido do plano em cache e reutilizado. O valor é um agregado de todas as execuções em lote até agora.
misses_cursors int Número de vezes em que um cursor inativo não foi encontrado na cache.
removed_cursors int Número de cursores que foram removidos devido à pressão de memória no plano em cache.
sql_handle Varbinary(64) O handle SQL para o lote.

Permissions

No SQL Server, requer VIEW SERVER STATE permissão.

Nos objetivos de serviço Azure SQL Database Basic, S0 e S1, e para bases de dados em pools elásticos, é necessária a conta de administrador do servidor ou a conta de administrador Microsoft Entra . Em todos os outros objetivos de serviço de base de dados SQL, a VIEW DATABASE STATE permissão é necessária na base de dados.

Permissões para SQL Server 2022 e posterior

Requer a permissão VIEW SERVER PERFORMANCE STATE no servidor.

Observações

Definir opções

Cópias do mesmo plano compilado podem diferir apenas pelo valor na coluna set_options . Isto indica que diferentes ligações estão a usar conjuntos distintos de opções SET para a mesma consulta. Usar conjuntos diferentes de opções é geralmente indesejável porque pode causar compilações extra, menos reutilização do plano e inflação do cache do plano devido a múltiplas cópias de planos no cache.

Avaliação de Opções de Conjuntos

Para traduzir o valor devolvido em set_options para as opções com que o plano foi compilado, subtraia os valores do valor set_options , começando pelo maior valor possível, até atingir 0. Cada valor que subtrai corresponde a uma opção que foi usada no plano de consulta. Por exemplo, se o valor em set_options for 251, as opções com que o plano foi compilado são ANSI_NULL_DFLT_ON (128), QUOTED_IDENTIFIER (64), ANSI_NULLS(32), ANSI_WARNINGS (16), CONCAT_NULL_YIELDS_NULL (8), Plano Paralelo(2) e ANSI_PADDING (1).

Opção Valor
ANSI_PADDING 1
ParallelPlan

Indica que as opções de paralelismo do plano mudaram.
2
FORCEPLAN 4
CONCAT_NULL_YIELDS_NULL 8
ANSI_WARNINGS 16
ANSI_NULLS 32
QUOTED_IDENTIFIER 64
ANSI_NULL_DFLT_ON 128
ANSI_NULL_DFLT_OFF 256
NoBrowseTable

Indica que o plano não utiliza uma tabela de trabalho para implementar uma operação FOR BROWSER.
512
TriggerOneRow

Indica que o plano contém otimização de linha única para tabelas delta de trigger AFTER.
1024
ResyncQuery

Indica que a consulta foi submetida por procedimentos armazenados internos do sistema.
2048
ARITH_ABORT 4096
NUMERIC_ROUNDABORT 8192
DATEFIRST 16384
DATEFORMAT 32768
ID do idioma 65536
UPON

Indica que a opção da base de dados PARAMETERIZATION foi definida para FORCED quando o plano foi compilado.
131072
ROWCOUNT Aplica-se a: SQL Server 2012 (11.x) e posteriores

262144

Cursors

Os cursores inativos são armazenados em cache num plano compilado para que a memória usada para armazenar o cursor possa ser reutilizada por utilizadores concorrentes de cursores. Por exemplo, suponha que um lote declara e usa um cursor sem o desalocar. Se houver dois utilizadores a executar o mesmo lote, haverá dois cursores ativos. Uma vez que os cursores são desalocados (potencialmente em lotes diferentes), a memória usada para armazenar o cursor é armazenada em cache e não é libertada. Esta lista de cursores inativos é mantida no plano compilado. Da próxima vez que um utilizador executar o batch, a memória do cursor em cache será reutilizada e inicializada adequadamente como cursor ativo.

Avaliação das Opções de Cursor

Para traduzir o valor devolvido em required_cursor_options e acceptable_cursor_options para as opções com que o plano foi compilado, subtraia os valores do valor da coluna, começando pelo maior valor possível, até chegar a 0. Cada valor que subtrai corresponde a uma opção de cursor que foi usada no plano de consulta.

Opção Valor
Nenhum 0
INSENSÍVEL 1
ROLO 2
SÓ LEITURA 4
PARA ATUALIZAÇÃO 8
LOCAIS 16
GLOBAL 32
FORWARD_ONLY 64
CONJUNTO DE CHAVES 128
DINÂMICA 256
SCROLL_LOCKS 512
OTIMISTA 1024
ESTÁTICA 2048
FAST_FORWARD 4096
NO LOCAL 8192
PARA select_statement 16384

Examples

A. Devolver os atributos para um plano específico

O exemplo seguinte devolve todos os atributos do plano para um plano especificado. A sys.dm_exec_cached_plans vista de gestão dinâmica é consultada primeiro para obter a alavanca do plano para o plano especificado. Na segunda consulta, substitua <plan_handle> por um valor de handle de planta da primeira consulta.

SELECT plan_handle, refcounts, usecounts, size_in_bytes, cacheobjtype, objtype   
FROM sys.dm_exec_cached_plans;  
GO  
SELECT attribute, [value], is_cache_key  
FROM sys.dm_exec_plan_attributes(<plan_handle>);  
GO  

B. Retornando as opções SET para planos compilados e o handle SQL para planos em cache

O exemplo seguinte devolve um valor que representa as opções com que cada plano foi compilado. Além disso, o handle SQL para todos os planos em cache é devolvido.

SELECT plan_handle, pvt.set_options, pvt.sql_handle  
FROM (  
    SELECT plan_handle, epa.attribute, epa.value   
    FROM sys.dm_exec_cached_plans   
        OUTER APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa  
    WHERE cacheobjtype = 'Compiled Plan') AS ecpa   
PIVOT (MAX(ecpa.value) FOR ecpa.attribute IN ("set_options", "sql_handle")) AS pvt;  
GO  

Ver também

Visualizações e funções de gerenciamento dinâmico (Transact-SQL)
Visualizações e funções de gerenciamento dinâmico relacionadas à execução (Transact-SQL)
sys.dm_exec_cached_plans (Transact-SQL)
sys.databases (Transact-SQL)
sys.objects (Transact-SQL)