Se você adicionar "muitas" ações a um evento em uma sessão de evento, receberá este erro:
Msg 25639, Level 16, State 23, Line 1 O evento, "[nome do evento]", excede o número de ações vinculadas permitidas.
Quantas ações são permitidas? Varia de acordo com o evento?
A resposta, baseada na experimentação, parece ser 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 por 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
Código de exemplo que é bem-sucedido (o mesmo, exceto excluindo o ú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 algumas ações diferentes e não parece estar relacionado a quais ações estão incluídas - mas talvez seja baseado em uma contagem total de caracteres de nomes de ações?)
Lista completa de ações com as quais 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)
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 "difícil", 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.
Você já se deparou com a infinidade de configurações possíveis, então sabe que não é totalmente 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 no catálogo XE
sys.dm_xe_objects
especificamente em algumas ações, verá que existemtype_name
colunastype_size
que 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).Agora, você provavelmente está pensando - ok, isso é ótimo, mas eu não conheço o limite mágico, então realmente não é útil. Pois é e não é. Se você olhar especificamente para isso do ponto de vista dos números, sim, não é muito útil ... no entanto, esta é uma maneira terrível de olhar para isso. Deve ser visto como: "Estou coletando apenas os dados de que preciso?" e na maioria dos casos você nunca terá um problema com esse erro.
Se tomarmos a definição na pergunta que não funciona, algumas das informações coletadas parecem realmente desnecessárias. Você realmente precisa de pilha de chamadas, ID de thread atual, tempo de ciclo da CPU, endereço do trabalhador e endereço do agendador? A pilha de chamadas é variável, o resto é fixo, portanto, apenas eliminando a pilha de chamadas, você pode encaixar mais colunas, se necessário. Eu não estou dizendo que você precisa de mais, mas você poderia.
A questão toda é 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é mesmo interrupção do sistema. Só porque você pode não significa que você deve. Não há nada afirmando que esses limites mudarão ou não entre 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.