Métodos para encontrar nuevos indicadores de seguimiento en SQL Server

38

Hay muchas banderas de seguimiento por ahí. Algunos están bien documentados, otros no, y otros llegaron al estado de comportamiento predeterminado en la versión 2016. Además de los canales de soporte oficiales, los empleados de Microsoft, etc., ¿cuáles son las formas de encontrar nuevos indicadores de seguimiento?

He leído un par de publicaciones recientes de Aaron Bertrand aquí y aquí , pero no vi nada sobre las nuevas banderas de seguimiento.

Copié los datos y el archivo de registro de mssqlsystemresource en una nueva ubicación, y los adjunté como una base de datos normal para examinar las tablas y vistas del sistema, pero no detecté nada de inmediato. Pensé en hacer una lista de indicadores de rastreo conocidos y recorrer números que no estaban en esa lista para ver cuáles permitiría DBCC TRACEON, pero quería hacer la pregunta aquí primero.

Suponiendo que el comando DBCC para habilitarlos tiene que registrarse con algún recurso para asegurarse de que el Indicador de seguimiento sea válido, ¿a dónde se dirige? ¿Hay un archivo .dll o algún otro archivo del sistema que contenga una lista?

Sé que la pregunta arroja una amplia red, pero lo que estimuló esto fue leer sobre una Bandera de seguimiento con un comportamiento específico específico junto con una nueva característica en 2016 que no estaba teniendo el efecto descrito. Mi pensamiento inicial fue que quizás los números se transpusieron de alguna manera, como 7129 convirtiéndose en 7219. Tenía la esperanza de obtener una lista de indicadores de seguimiento válidos dentro de un rango, digamos 7000-7999, para buscar permutaciones. Probarlos todos, tanto como indicadores DBCC TRACEON como parámetros de inicio, sería una molestia, combinada con la prueba de los resultados contra el comportamiento de la característica.

Erik Darling
fuente

Respuestas:

42

No hay nada que pueda hacer para encontrar la lista, excepto preguntar o recogerlos de publicaciones / diapositivas / etc. La lista solo existe en el código, en un archivo de encabezado donde los números de marca de seguimiento válidos se asignan a nombres en una gran enumeración en el código de C ++, y luego los nombres se usan en el resto del código.

Como dijo Aaron, puede habilitar cualquier número de indicador de seguimiento, y si no hace nada, o no ejerce la funcionalidad para la que el indicador de seguimiento es relevante, no notará ninguna diferencia en el comportamiento.

DBCC TRACEON no verifica nada, ya que no hay una lista de tiempo de ejecución de qué números son válidos o no, solo habilita ese número de indicador de seguimiento en un mapa de bits de los indicadores configurados para esa conexión / globalmente.

El problema con tener una verificación de validez es que expondría qué indicadores de rastreo son válidos, lo que les permite ser descubiertos. De esta manera, la 'lista válida' se ofusca efectivamente, que es lo que quiere el equipo SQL.

Con respecto a la sugerencia de Kin en un comentario que SQL Server debería tener select * from sys.available_trace_flags: sí y no. Hay muchos indicadores de seguimiento que son muy perjudiciales para el rendimiento y solo son necesarios para la depuración de problemas bajo la guía del Soporte del producto, pero SQL Server podría enumerar los indicadores "seguros".

Paul S. Randal
fuente
2
Un pequeño reto: DBCC TRACEON sí verifica algo. Este resumen muestra el código que recorre los indicadores de seguimiento a partir de 1. Todas las versiones actuales de SQL Server saldrán y arrojarán un error en el número máximo de indicador de seguimiento actual: gist.github.com/BrentOzar/0e9692da8ceffeb2b4bdd064e36d3174
Brent Ozar
41

¿Cuáles son las formas de encontrar nuevas marcas de seguimiento?

En su mayor parte, se trata de tener el tiempo y los recursos emocionales para gastar en su búsqueda.

Ciertamente, es posible escribir un script para recorrer los posibles números de marca de seguimiento y analizar los efectos, pero esto no siempre es fructífero. Hay muchas razones para eso, pero las frustraciones comunes incluyen el hecho de que algunas marcas de rastreo solo son efectivas en combinación con otras, algunas solo funcionan con el -Tinicio o cuando se usan con otras DBCC TRACEON, solo con OPTION (QUERYTRACEON). Algunos requieren comandos indocumentados, o extensiones de comandos, o para que se habilite también una característica particular. Algunos solo producen efectos si sabes dónde buscar esos efectos. Y así sucesivamente y ... mucho ... así sucesivamente.

Dicho esto, quizás la técnica más efectiva es pasar paso a paso a través de la ejecución de una consulta o comando en particular con un depurador u otra herramienta de creación de perfiles adjunta, comparando las rutas tomadas con las marcas de seguimiento activadas y desactivadas. Si esto suena lento, es porque lo es.

Para mí, algo tiene que ser potencialmente muy interesante o estar relacionado con un problema del mundo real sin una mejor solución para que yo piense siquiera en abordarlo. También es útil si ha pasado por este proceso cientos o miles de veces antes, para tener una idea general del tipo de cosas que está buscando, qué rango de indicadores de rastreo es más probable que sea efectivo y qué parte del código base va a ser interesante.

Establecer un punto de interrupción CSessionTraceFlags::CheckSessionTraceInternaly verificar el valor del edxregistro (para ver qué indicador de seguimiento se está comprobando) puede ser útil en casos simples, pero los casos interesantes a menudo no son simples, y no todos los indicadores de seguimiento se verifican en el punto donde afectar la ruta del código tomada.

Hay una lista bastante pequeña de banderas de rastreo oficiales . Estas son las banderas que se han probado completamente y son (y serán) compatibles con CSS y, en última instancia, los desarrolladores de productos. También son banderas con un caso de uso lo suficientemente común como para que valga la pena documentarlo.

Cualquier otro indicador de rastreo que encuentre es una curiosidad que podría tener efectos inesperados en diversas situaciones (diferentes compilaciones, SKU, configuraciones de seguridad, diferentes características ... cualquier otra cosa que pueda o no pueda pensar). Estos solo serán 'apoyados' por la persona que escribió sobre ellos, si es que lo hicieron.

Hay varias listas no oficiales, la mejor que conozco es una colección tópica de banderas de SQL Server de Aaron Morelli (actualmente en v6, abril de 2016).

Dicho todo esto, Microsoft CSS (en última instancia) tiene acceso a todos los indicadores de seguimiento, por lo que pueden asesorarlo sobre cualquier cosa que encuentre, incluso si no están en la lista oficial. Pueden elegir no decir nada, por supuesto, y puede haber una tarifa involucrada; Realmente no lo sé, nunca había tomado esa ruta yo mismo

Paul White dice GoFundMonica
fuente