Existem muitos sinalizadores de rastreamento por aí. Alguns estão bem documentados, outros não, e outros chegaram ao status de comportamento padrão na versão 2016. Além dos canais de suporte oficiais, funcionários da Microsoft, etc., quais são as maneiras de encontrar novos sinalizadores de rastreamento?
Eu li algumas postagens recentes de Aaron Bertrand aqui e aqui , mas não vi nada sobre os novos sinalizadores de rastreamento.
Copiei os dados e o arquivo de log do mssqlsystemresource para um novo local e anexei-o como um banco de dados regular para vasculhar as tabelas e exibições do sistema, mas não localizei nada imediatamente. Considerei pegar uma lista de sinalizadores de rastreamento conhecidos e percorrer os números que não estão nessa lista para ver quais DBCC TRACEON permitiria, mas queria fazer a pergunta aqui primeiro.
Supondo que o comando DBCC para habilitá-los tenha que fazer check-in com algum recurso para garantir que o sinalizador de rastreamento seja válido, para onde ele chega? Existe um .dll ou algum outro arquivo de sistema que contenha uma lista?
Eu sei que a pergunta lança uma rede ampla, mas o que estimulou isso foi ler sobre um sinalizador de rastreamento com comportamento pretendido específico ao lado de um novo recurso em 2016 que não estava tendo o efeito descrito. Meu pensamento inicial foi que talvez os números tenham sido transpostos de alguma forma, como 7129 se tornando 7219. Eu esperava obter uma lista de sinalizadores de rastreamento válidos dentro de um intervalo, digamos 7000-7999, para procurar permutações. Testar todos eles, como sinalizadores DBCC TRACEON e parâmetros de inicialização, seria um incômodo, combinado com o teste dos resultados em relação ao comportamento do recurso.
Não há nada que você possa fazer para encontrar a lista, exceto perguntar ou buscá-la em postagens/apresentações de slides/etc. A lista existe apenas no código, em um arquivo de cabeçalho onde os números de sinalizadores de rastreamento válidos são mapeados para nomes em uma grande enumeração no código C++ e, em seguida, os nomes são usados no restante do código.
Como Aaron disse, você pode ativar qualquer número de sinalizador de rastreamento e, se ele não fizer nada ou se você não exercer a funcionalidade para a qual o sinalizador de rastreamento é relevante, não notará nenhuma diferença no comportamento.
DBCC TRACEON
não verifica nada - já que não há lista de tempo de execução de quais números são válidos ou não - apenas permite esse número de sinalizador de rastreamento em um bitmap de quais sinalizadores são definidos para essa conexão/globalmente.O problema de ter uma verificação de validade é que exporia quais sinalizadores de rastreamento são válidos, permitindo que fossem descobertos. Dessa forma, a 'lista válida' é efetivamente ofuscada, que é o que a equipe SQL deseja.
Em relação à sugestão de Kin em um comentário que o SQL Server deveria ter
select * from sys.available_trace_flags
- Sim e não. Existem muitos sinalizadores de rastreamento que são altamente prejudiciais ao desempenho e são necessários apenas para depurar problemas sob orientação do Suporte ao produto, mas o SQL Server pode listar os sinalizadores 'seguros'.Na maioria das vezes, tudo se resume a ter tempo e recursos emocionais para gastar procurando por eles.
Certamente, é possível escrever um script para percorrer possíveis números de sinalizadores de rastreamento e analisar os efeitos, mas isso nem sempre é frutífero. Há muitas razões para isso, mas as frustrações comuns incluem o fato de que alguns sinalizadores de rastreamento são eficazes apenas em combinação com outros, alguns funcionam apenas
-T
na inicialização ou quando usados comDBCC TRACEON
, alguns apenas comOPTION (QUERYTRACEON)
. Alguns exigem comandos não documentados, ou extensões de comando, ou para que um recurso específico também seja ativado. Alguns só produzem efeitos se você souber onde procurá-los. E assim por diante e ... muito ... assim por diante.Dito isso, talvez a técnica mais eficaz seja percorrer a execução de uma determinada consulta ou comando passo a passo com um depurador ou outra ferramenta de criação de perfil anexada, comparando os caminhos percorridos com o(s) sinalizador(es) de rastreamento ativado e desativado. Se isso parece demorado, é porque é.
Para mim, algo tem que ser potencialmente muito interessante, ou estar relacionado a um problema do mundo real sem uma solução melhor para eu sequer pensar em entrar nisso. Também é útil se você já passou por esse processo centenas ou milhares de vezes antes, para ter uma noção geral do tipo de coisa que está procurando, qual faixa de sinalizadores de rastreamento tem maior probabilidade de ser eficaz e qual parte da base de código será interessante.
Definir um ponto de interrupção
CSessionTraceFlags::CheckSessionTraceInternal
e verificar o valor doedx
registro (para ver qual sinalizador de rastreamento está sendo verificado) pode ser útil em casos simples, mas os casos interessantes geralmente não são simples - e nem todos os sinalizadores de rastreamento são verificados no ponto em que eles afetam o caminho do código tomado.No SQL Server 2019, defina um ponto de interrupção em
sqllang!GetGlobalTraceFlagStore
. Quando essa função muito curta retornar, o chamador colocará o número do sinalizador de rastreamento no registroedx
como acima, antes de chamarsqllang!get_bit
para verificar se o sinalizador está definido.Há uma lista bastante pequena de sinalizadores de rastreamento oficiais . Esses são os sinalizadores que foram totalmente testados e são (e serão) suportados pelo CSS e, em última análise, pelos desenvolvedores do produto. Eles também são sinalizadores com um caso de uso comum o suficiente para valer a pena documentar.
Qualquer outro sinalizador de rastreamento que você encontrar é uma curiosidade que pode ter efeitos inesperados em várias situações (diferentes compilações, SKUs, configurações de segurança, recursos diferentes... qualquer outra coisa em que você possa ou não pensar). Estes só serão 'apoiados' pela pessoa que escreveu sobre eles, se for o caso.
Existem várias listas não oficiais, a melhor que conheço é A Topical Collection of SQL Server Flags de Aaron Morelli (atualmente na v6, abril de 2016).
Dito isso, o Microsoft CSS (finalmente) tem acesso a todos os sinalizadores de rastreamento, portanto, eles podem aconselhá-lo sobre qualquer um que você encontrar, mesmo que não esteja na lista oficial. Eles podem optar por não dizer nada, é claro, e pode haver uma taxa envolvida; Eu realmente não sei, nunca tendo ido por esse caminho.
Mantemos uma coleção de sinalizadores de rastreamento no github (agora 599 sinalizadores de rastreamento):
Sinalizadores de rastreamento do Microsoft SQL Server
Além disso, uma técnica muito boa descrita por Brent Ozar em seu ótimo artigo Bad Idea Jeans: Finding Undocumented Trace Flags e Joe Obbish neste incrível artigo A Method to Find Trace Flags