sql >> Base de Datos >  >> RDS >> Database

Preguntas y respuestas de nuestra serie de seminarios web sobre detección de parámetros

Los últimos dos miércoles, organizamos una serie de seminarios web de dos partes que tratan los problemas de sensibilidad de los parámetros:

  • Procedimientos almacenados, Parámetros, Problemas…
    Kimberly L. Tripp y Aaron Bertrand
    24 de enero
    ¿Te lo perdiste? ¡Regístrese para verlo ahora!

  • Cómo abordar la detección de parámetros con SentryOne
    Aaron Bertrand, Kimberly L. Tripp y Andy Mallon
    31 de enero
    ¿Te lo perdiste? ¡Míralo ahora!

Surgieron algunas preguntas durante ambos seminarios web y pensé en compilarlas y responderlas aquí (algunas de las respuestas provinieron de Andy durante el seminario web).

En un problema que hemos visto recientemente, estamos viendo que los planes se eliminan del caché muy rápidamente. No estamos realizando nada de lo que describe (DBCC FREEPROCCACHE etc.); ¿La presión de la memoria también puede causar que esto suceda?

Sí, la presión de la memoria podría ser un factor (consulte esta publicación), y sé que también hay algunas investigaciones sobre posibles problemas con la administración de memoria de SQL Server en este sentido.

De un asistente:"No es una pregunta, sino un comentario para el usuario que pregunta sobre las muchas veces que se vacía la memoria caché de su plan. También tuvimos eso y, de hecho, fue presión de memoria. Teníamos la memoria máxima del servidor configurada incorrectamente, eso fue se corrigió usando la fórmula mencionada aquí, y luego teníamos el procedimiento de este artículo ejecutándose cada 10 minutos (tenemos toneladas de SQL dinámico, solo se usa una vez)."

¿Qué sucede si usa OR? en la cláusula where en lugar de AND , ¿persistiría el problema?

Por lo general, si usa OR en este tipo de patrón, obtendrá todas las filas cada vez, a menos que cada parámetro se complete con valores que filtran las filas. Esto cambia la semántica de la consulta de "todas estas cosas tienen que ser verdad" a "cualquiera de estas cosas puede ser verdad". Aún así, el plan que se compila para el primer conjunto de parámetros aún se almacenará en caché y persistirá para ejecuciones futuras, ya sea que sus cláusulas usen AND o OR .

¿Es eso 1=1? marcar un buen enfoque? ¿No es mejor agregar solo los parámetros que se proporcionan y, por lo tanto, evitar el feo 1=1? ?

El 1 = 1 SQL Server prácticamente lo ignora, pero permite agregar todas las cláusulas condicionales con AND para que no tengas que tratar al *primero* de manera diferente. Aquí está la alternativa:

SET @IncludedWhereClauseYet bit = 0;
SET @sql = N'SELECT cols FROM dbo.Table';
 
IF @param1 IS NOT NULL
BEGIN
  IF @IncludedWhereClauseYet = 0
  BEGIN
    SET @sql += N' WHERE ';
    SET @IncludedWhereClauseYet = 1;
  END
  ELSE
  BEGIN
    SET @sql += N' AND ';
  END
  SET @sql += N' @param1 = @param1';
END
 
IF @param2 IS NOT NULL
BEGIN
  IF @IncludedWhereClauseYet = 0
  ...
END
...

El 1=1 le permite simplificar, permitiéndole siempre prefijar cualquier cláusula con AND . El código anterior se convierte en:

SET @sql = N'SELECT cols FROM dbo.Table WHERE 1 = 1';
 
IF @param1 IS NOT NULL
BEGIN
  SET @sql += N' AND @param1 = @param1';
END
 
IF @param2 IS NOT NULL
BEGIN
  SET @sql += N' AND @param2 = @param2';
END

Quizás podría usar una cláusula inicial diferente para evitar todos los condicionales, como WHERE PrimaryKey > 0 o WHERE PrimaryKey IS NOT NULL , y luego cada cláusula subsiguiente podría comenzar con AND . Pero 1 = 1 , aunque feo, es inofensivo, y en mi humilde opinión no es menos feo que agregar una cláusula *real* pero sin sentido, excepto que una cláusula *real* podría afectar el plan.

Recuerde que cuando está construyendo código T-SQL con T-SQL, tiene dos aspectos de "feo" en los que pensar:a veces solucionará los problemas del código anterior y, a veces, resolverá los problemas de la consulta que surge de eso. Ten cuidado de sacrificar uno por el bien del otro.

¡¿QUÉ?! Me lo he perdido por completo... WITH RECOMPILE . Pensé que vaciaba el plan, pero lo deja solo para esta ejecución... ¡Es muy importante saberlo!

Solo asegúrese de conocer también las desventajas.
Vea esta excelente publicación de Paul White.

Es OPTION OPTIMIZE FOR @parametername UNKNOWN ¿Ya no se prefiere en las versiones más recientes de SQL?

No creo que sea mejor o peor en las versiones modernas que cuando se introdujo por primera vez en SQL Server 2008. Hasta donde yo sé, incluso con todos los cambios en el optimizador y el estimador de cardinalidad, ese bit todavía se comporta de la misma manera.

¿Hay alguna carga en el servidor si habilito la captura de estadísticas de procedimientos y estadísticas de consultas en SentryOne?

La recopilación de estadísticas de procedimientos y consultas debe estar activada de forma predeterminada. Toda la recopilación de datos tiene un costo, pero SQL Sentry tiene mucho cuidado con el costo de la recopilación.

La búsqueda en RS no la estaba usando como un predicado residual, estaba buscando algo más que no podía ver.

Gracias, revisaré ese ejemplo y publicaré un blog sobre las demostraciones por separado, asegurándome de incluir cualquier detalle relevante que no fuera obvio solo con el diagrama del plan.

¿No es cierto que agregar algunas de las columnas necesarias como INCLUDE s en realidad no hace que el índice sea más efectivo porque la búsqueda de clave no se eliminará? Estoy pensando que el porcentaje no debería cambiar a menos que elimines la búsqueda de claves.

Estrictamente, sí, eso es cierto. La consulta original fue un mal ejemplo primordial, usando SELECT * y un índice al que le falta un número desesperado de columnas. El punto que estaba tratando de hacer es que la pestaña Análisis de índice lo alienta a (a) mejorar la consulta y (b) hacer que la cubierta del índice. El puntaje está ahí para tentarlo a hacer una o ambas cosas:si cambia la consulta para que necesite menos columnas, el índice se acerca más a cubrir la consulta también. Si va a crear un índice de cobertura nuevo, separado, también tiene la información sobre qué columnas se requieren para cubrir esta consulta específica. Técnicamente, tiene razón, agregar una columna de inclusión pero aún requerir una búsqueda de otras 4 no hará que esta consulta específica funcione mejor, y no mejorará el índice, pero indica que usted cada vez más cerca. La esperanza es que no se detenga simplemente agregando una columna de inclusión e ignore el resto. No sabemos cuándo vas a parar, así que no sé si hay una solución perfecta; ciertamente no queremos desalentarlo. a los usuarios hacer que sus índices se adapten mejor a sus consultas.

¿Por qué vemos consultas que usan el parámetro de nombre y el parámetro de apellido resumidos en una declaración que usa solo un parámetro de apellido?

ACTUALIZAR: Esto es intencional. La agrupación bajo Mostrar totales agrupa el mismo procedimiento llamado con todas las diversas combinaciones de parámetros. Por lo tanto, puede usarlo primero para determinar qué parámetros tienden a causar el peor rendimiento, luego, dentro de eso, profundice para ver si hay o no sesgo de datos. Un parámetro que conduce a una búsqueda en una columna no indexada, por ejemplo, probablemente aparecerá en la parte superior de manera bastante confiable, y puede ver eso en combinación con otros parámetros que se pasan y también se comparan con todas las llamadas donde ese parámetro no estaba t pasó.

Habiendo dicho todo eso, buscaremos afinar este comportamiento de agrupación a medida que finalicemos los cambios actualmente en curso para la pantalla Top SQL.

¿Hay alguna documentación sobre cómo usar una guía del plan? Actualmente no tengo idea de cómo hacer eso.

Esto es algo más sobre lo que quería escribir un blog, pero Microsoft tiene algunos temas aquí mientras tanto (y consulte todos los enlaces relacionados en la barra lateral).

¿Necesito habilitar algo para obtener el gráfico del historial de consultas?

No, esto debe habilitarse en todas las versiones modernas de la aplicación cliente SentryOne. Si no lo ves, prueba con Tools > Reset Layout; si eso no funciona, comuníquese con [email protected].

¿Existen casos en los que se fuerza el último plan correcto conocido mediante Query Store cuando se considera que una regresión del plan es una mala idea? ¿Eso tenderá a ocultar problemas que se abordan mejor cambiando la declaración como la que ha mostrado?

Forzar un plan es a menudo una opción de último recurso, y tiendo a reservarlo para casos en los que realmente, realmente, realmente no puedes arreglar la declaración (o cambiar el índice). Forzar un plan siempre puede conducir a un comportamiento incorrecto, porque todavía es un ser humano el que toma esa decisión, y podrías estar basándote en información incorrecta. La regresión puede deberse a un cambio de plan, pero si lo considera una regresión porque el tiempo de ejecución fue más largo, ¿ha investigado otras posibles razones? Por ejemplo, supongamos que el sistema se reinició o hubo una conmutación por error y obtuvo un nuevo plan porque el anterior fue desalojado, y tal vez las estadísticas también hayan cambiado mientras tanto, pero ahora la consulta dura más no porque el plan sea peor sino más bien porque los búferes estaban vacíos. Así que sí, ciertamente no sugeriría forzar un plan en cada regresión.

SentryOne no siempre captura datos o parámetros todo el tiempo, por lo que no tengo suficiente información. ¿Cómo me aseguro de que SentryOne capture parámetros y planes de ejecución todo el tiempo?

Realmente no puede porque todo depende de cómo se ejecutan sus consultas, cómo las capturamos y qué tan rápido se ejecutan. A menudo, sus consultas no se ejecutan lo suficiente como para capturarlas por completo, y debemos confiar en las vistas de estadísticas de consultas/procedimientos agregados de SQL Server, que no recopilan información de parámetros. Puede cambiar la configuración de la recopilación para Top SQL Source para capturar más y en un intervalo más frecuente, pero necesita equilibrar la cantidad de datos que recopila con la cantidad de información adicional que obtiene.

¿Puedo consultar la información para poder automatizar y generar informes?

No tenemos nada listo para usar para que hagas esto, pero déjame devolvérselo al equipo y ver qué tipo de opciones se nos ocurren. Algo con lo que jugué en este seminario web fue crear una Condición de advertencia para captar los tipos de regresiones que estamos buscando, pero el tiempo se convirtió en un factor.

¿Cómo decidimos cuándo usar OPTION (RECOMPILE) , ya que todos los días recibimos diferentes planes para diferentes parámetros?

Diría que comience con las consultas que fluctúan más con la sensibilidad de los parámetros. Si tengo una consulta que a veces tarda 2 segundos pero a veces 30, y otra que va de 4 a 6 segundos,
me voy a centrar en la primera.

Cuál es mejor usar, OPTION (RECOMPILE) o QUERYTRACEON , en el caso de la detección de parámetros.

Prefiero OPTION (RECOMPILE) por dos razones. Uno, es autodocumentado; nadie que lea el código se preguntará qué está haciendo, pero no todos los que lean el código habrán memorizado números TF como 4136. Dos, no requiere permisos elevados:intente usar QUERYTRACEON como peón.

¿Es posible alertar o informar sobre trámites que demoran más de lo habitual? Más interesados ​​en procedimientos de conteo alto.

Absolutamente, podría usar una Condición de aviso, pero puede complicarse un poco porque, para los procedimientos que incluso a veces se ejecutan por debajo del umbral de recopilación, necesitaría comparar instantáneas de las estadísticas del procedimiento del DMV. También agregué un recordatorio al blog sobre esto, ya que es algo que he ayudado a los clientes a implementar en el pasado.

Microsoft está haciendo que el ajuste automático sea el predeterminado para Azure SQL Database, incluida la corrección automática del plan. ¿Te parece una buena idea?

Me reservaré el juicio hasta que yo (o algunos clientes) hayamos jugado con él. Decidir cómo afinar es lo suficientemente desafiante para los mortales; los mortales que escriben software para ajustarlo parecen al menos igual de desafiantes, si no más. Cuando Andy vio esta pregunta, me mencionó que le recordaba a SQL Server 2000:el argumento de marketing entonces era que era tan autoajustable que ya no necesitaríamos administradores de bases de datos. Ese reclamo no ha envejecido bien.

Ser capaz de seleccionar los dos puntos en el gráfico del historial de consultas y comparar sería bueno.

Estoy de acuerdo.
Estén atentos.