Qual é o número máximo de ações vinculadas permitidas para um evento estendido?

14

Se você adicionar ações "demais" a um evento em uma sessão de evento, você receberá este erro:

Msg 25639, Nível 16, Estado 23, Linha 1 O evento "[nome do evento]" excede o número de ações vinculadas permitidas.

Quantas ações são permitidas? Isso varia de acordo com o evento?

A resposta, baseada em experimentação, parece ter 27 para sqlserver.rpc_completed. Mas não encontrei esse número em nenhuma documentação da Microsoft . E parece variar de acordo com o evento, pois consegui 30 sqlserver.sql_batch_completed.

Código de exemplo que falha:

CREATE EVENT SESSION [Test] ON SERVER 
ADD EVENT sqlserver.rpc_completed(
    ACTION(
        package0.callstack,
        package0.collect_cpu_cycle_time,
        package0.collect_current_thread_id,
        package0.collect_system_time,
        package0.event_sequence,
        package0.last_error,
        package0.process_id,
        sqlos.cpu_id,
        sqlos.numa_node_id,
        sqlos.scheduler_address,
        sqlos.scheduler_id,
        sqlos.system_thread_id,
        sqlos.task_address,
        sqlos.task_elapsed_quantum,
        sqlos.task_resource_group_id,
        sqlos.task_resource_pool_id,
        sqlos.task_time,
        sqlos.worker_address,
        sqlserver.client_app_name,
        sqlserver.client_connection_id,
        sqlserver.client_hostname,
        sqlserver.client_pid,
        sqlserver.context_info,
        sqlserver.database_id,
        sqlserver.database_name,
        sqlserver.is_system,
        sqlserver.nt_username,
        sqlserver.plan_handle))
GO
DROP EVENT SESSION [Test] ON SERVER
GO

Exemplo de código bem-sucedido (o mesmo, exceto a exclusão do último item):

CREATE EVENT SESSION [Test] ON SERVER 
ADD EVENT sqlserver.rpc_completed(
    ACTION(
        package0.callstack,
        package0.collect_cpu_cycle_time,
        package0.collect_current_thread_id,
        package0.collect_system_time,
        package0.event_sequence,
        package0.last_error,
        package0.process_id,
        sqlos.cpu_id,
        sqlos.numa_node_id,
        sqlos.scheduler_address,
        sqlos.scheduler_id,
        sqlos.system_thread_id,
        sqlos.task_address,
        sqlos.task_elapsed_quantum,
        sqlos.task_resource_group_id,
        sqlos.task_resource_pool_id,
        sqlos.task_time,
        sqlos.worker_address,
        sqlserver.client_app_name,
        sqlserver.client_connection_id,
        sqlserver.client_hostname,
        sqlserver.client_pid,
        sqlserver.context_info,
        sqlserver.database_id,
        sqlserver.database_name,
        sqlserver.is_system,
        sqlserver.nt_username))
GO
DROP EVENT SESSION [Test] ON SERVER
GO

(Tentei duas ações diferentes e parece não estar relacionado a quais ações estão incluídas - mas talvez seja baseado na contagem total de caracteres dos nomes das ações?)

Lista completa de ações com as quais eu estava trabalhando:

package0.callstack,
package0.collect_cpu_cycle_time,
package0.collect_current_thread_id,
package0.collect_system_time,
package0.event_sequence,
package0.last_error,
package0.process_id,
sqlos.cpu_id,
sqlos.numa_node_id,
sqlos.scheduler_address,
sqlos.scheduler_id,
sqlos.system_thread_id,
sqlos.task_address,
sqlos.task_elapsed_quantum,
sqlos.task_resource_group_id,
sqlos.task_resource_pool_id,
sqlos.task_time,
sqlos.worker_address,
sqlserver.client_app_name,
sqlserver.client_connection_id,
sqlserver.client_hostname,
sqlserver.client_pid,
sqlserver.context_info,
sqlserver.database_id,
sqlserver.database_name,
sqlserver.is_system,
sqlserver.nt_username,
sqlserver.plan_handle,
sqlserver.query_hash,
sqlserver.query_hash_signed,
sqlserver.query_plan_hash,
sqlserver.query_plan_hash_signed,
sqlserver.request_id,
sqlserver.server_instance_name,
sqlserver.server_principal_name,
sqlserver.server_principal_sid,
sqlserver.session_id,
sqlserver.session_nt_username,
sqlserver.session_resource_group_id,
sqlserver.session_resource_pool_id,
sqlserver.session_server_principal_name

@@ VERSION Saída:

Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 
    Oct 28 2016 18:17:30 
    Copyright (c) Microsoft Corporation
    Developer Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ) (Hypervisor)
Riley Major
fonte

Respostas:

9

Quantas ações são permitidas? Isso varia de acordo com o evento?

Eu fiz algumas pesquisas e sim, há um limite para o número de ações e eventos que podem ser adicionados a uma definição de evento estendida. Não é um valor "rígido", mas baseado em muitas entradas diferentes; portanto, uma definição que não funciona pode funcionar apenas com a remoção de um único evento ou uma única ação em um único evento.

E parece variar de acordo com o evento, pois consegui 30 por sqlserver.sql_batch_completed.

Você já se deparou com uma infinidade de configurações possíveis, portanto sabe que não é inteiramente baseado no número de ações. Também não é específico para cada evento, mas uma combinação dos valores.

O que você pode fazer?

O primeiro item é que os dados de comprimento variável são o maior problema que você enfrentará. Como você sabe o que é comprimento variável e o que não é? Se você olhar sys.dm_xe_objectsespecificamente no catálogo do XE em algumas ações, verá que existem colunas type_namee type_sizeque podem ser úteis para ver se você está adicionando vários pontos de dados de tamanho variável (tamanho 0 na captura de tela abaixo).

insira a descrição da imagem aqui

Agora, você provavelmente está pensando - ok, isso é ótimo, mas eu não sei o limite mágico, então isso realmente não ajuda. Bem, é e não é. Se você olha especificamente para ele do ponto de vista dos números, sim, não ajuda muito ... no entanto, essa é uma maneira terrível de ver isso. Deve ser encarado como "Estou coletando apenas os dados necessários?" e na maioria dos casos, você nunca terá problemas com esse erro.

Se considerarmos a definição na pergunta que não funciona, algumas das informações coletadas parecem que realmente não são necessárias. Você realmente precisa de pilha de chamadas, ID de encadeamento atual, tempo de ciclo da CPU, endereço do trabalhador e endereço do agendador? O Callstack é variável, o restante é fixo, portanto, basta eliminar o callstack para caber em mais colunas, se necessário. Não estou dizendo que você precisa mais, mas pode.

O objetivo é limitar a definição a ser tão pequena quanto necessário. A coleta de tudo resultará em erros (como você teve aqui), lentidão do sistema, muitos dados para análise ou até interrupção do sistema. Só porque você pode, não significa que deveria. Não há nada declarando que esses limites mudem ou não entre as versões principais ou secundárias; portanto, manter a verdadeira necessidade mínima é a melhor prevenção. Por favor, não marque todas as caixas (GUI) ou adicione todas as ações possíveis.

Sean diz remover Sara Chipps
fonte
Corri para problemas semelhantes ao adicionar muitos eventos a uma única sessão ao testar uma ferramenta QueryableXEventData que estava desenvolvendo. Especificar apenas os eventos, ações e campos realmente necessários é um bom conselho.
Dan Guzman