Hola, chicos,
¡Buen día!

En esta publicación, presentaré y demostraré el uso de la herramienta de código abierto. SQLQueryEstrés, de Adam Machanic (creador de sp_WhoIsActive), que se utiliza para realizar pruebas de estrés ejecutando una consulta determinada, lo que le permite realizar una serie de pruebas en su instancia de SQL. Como Adam ya no mantiene ni actualiza este proyecto, Erik Ejlskov Jensen creó un GitHub para crear nuevas funciones y mejoras para la herramienta.

La herramienta permite definir cuántos hilos se ejecutarán simultáneamente, cuántas ejecuciones y cuál es el intervalo de tiempo entre cada ejecución, permitiéndote realizar varios tipos de pruebas, de las cuales destaco:

  • Verifique el comportamiento de la instancia con un número determinado de sesiones en ejecución
  • Ejecutar varias consultas al mismo tiempo para estresar la CPU, el disco y la memoria del servidor y comprobar su comportamiento.
  • Simulación de un entorno crítico con múltiples transacciones por segundo durante pruebas del sistema y consultas SQL.
  • Identificar cuantas veces se ejecuta un SP por día, realizar una optimización y simular cuál sería el ahorro de tiempo en el día
  • Ejecutar una consulta o SP varias veces, con parámetros aleatorios y analizar su comportamiento

De todos modos, la lista de posibilidades es muy grande y el software te brinda varias herramientas para mejorar tu análisis, como la posibilidad de usar o no el Connection Pool, borrar cachés, borrar el buffer, etc.

Usar la herramienta es muy sencillo, por lo que no haré muchas demostraciones. El propósito de este post es compartir esta herramienta para quienes aún no la conocían, para que puedan mejorar su análisis del rendimiento de las instancias de SQL Server que demuestres o realices pruebas de rendimiento sobre una consulta.

Después de descargar la herramienta ejecutable. en este enlace, verá la pantalla de presentación de SQLQueryStress. Haga clic en el botón "Base de datos" para configurar la conexión de la base de datos.

No recomiendo usar este software en entornos de producción., a menos que sea durante un tiempo de mantenimiento programado y desee realizar una prueba de esfuerzo de la instancia.

Pantalla de inicio de SQLQueryStress

En esta pantalla puede ingresar el nombre del servidor\instancia de conexión, así como el tipo de autenticación, los datos de usuario y contraseña.

Pantalla de configuración de conexión a la base de datos

De regreso a la pantalla de inicio, definamos la consulta que se ejecutará, los parámetros de ejecución y comencemos el procesamiento.

Parámetros de ejecución:
Número de iteraciones: Este es el número de veces que se ejecutará la consulta.
Número de hilos: Número de sesiones que se ejecutarán en paralelo (al mismo tiempo)
Retraso entre consultas (ms): Número de milisegundos entre el final de una consulta y el comienzo de la siguiente.

Cabe mencionar que la cantidad de veces que se ejecutará la consulta se basa en el Número de Iteraciones x Número de Hilos, es decir, si colocas 10 iteraciones con 5 hilos, tu consulta se ejecutará 50 veces.

Resultado de la ejecución:

Resultado de WhoIsActive, que demuestra las conexiones que se ejecutan:

(Nota: tuve que poner un WAITFOR DELAY en los SP para que aparecieran en WhoIsActive, ya que el SP de prueba es muy simple y corre muy rápido)

Cómo utilizar la sustitución de parámetros

Haga clic aquí para obtener más información sobre la sustitución de parámetros
Una característica realmente interesante que les mostraré es la sustitución de parámetros, que le permite ejecutar consultas y pasar parámetros de SP en función de la devolución de una consulta.

En este ejemplo, crearé una tabla e insertaré varios valores aleatorios que se usarán como parámetros para las llamadas al SP que probaré en SQLQueryStress.

Creando la función para generar números aleatorios:

IF (OBJECT_ID('dbo.fncRand') IS NOT NULL) DROP FUNCTION dbo.fncRand
GO

/*
Vou criar uma função para usar no SELECT e realmente trazer valores aleatórios
para cada linha
*/
CREATE FUNCTION dbo.fncRand(@Numero BIGINT)
RETURNS BIGINT
AS
BEGIN
    RETURN (ABS(CHECKSUM(PWDENCRYPT(N''))) / 2147483647.0) * @Numero
END
GO

Generación de datos aleatorios para pruebas.

IF (OBJECT_ID('dbo.Testes') IS NOT NULL) DROP TABLE dbo.Testes
CREATE TABLE dbo.Testes (
    Nome VARCHAR(60),
    Dt_Nascimento DATETIME,
    CPF VARCHAR(11)
)


-- Carga inicial
INSERT INTO dbo.Testes
SELECT
    CAST(NEWID() AS VARCHAR(50)) AS Nome,
    DATEADD(DAY, dbo.fncRand(12000), '1980-01-01') AS Dt_Nascimento,
    RIGHT(REPLICATE('0', 11) + CAST(dbo.fncRand(99999999999) AS VARCHAR(11)), 11) AS CPF


DECLARE @Contador INT = 1, @Total INT = 16

WHILE(@Contador <= @Total)
BEGIN

    -- Executo esse trecho várias vezes
    INSERT INTO dbo.Testes
    SELECT
        CAST(NEWID() AS VARCHAR(50)) AS Nome,
        DATEADD(DAY, dbo.fncRand(12000), '1980-01-01') AS Dt_Nascimento,
        RIGHT(REPLICATE('0', 11) + CAST(dbo.fncRand(99999999999) AS VARCHAR(11)), 11) AS CPF
    FROM
        dbo.Testes


    SET @Contador += 1


END

Ejemplo de una tabla con datos aleatorios:

Una vez creada y completada la tabla con los datos de la prueba, simplemente configure la sustitución de parámetros en el software:


¡Eso es todo, amigos!
Espero que hayas disfrutado de esta publicación y de esta excelente herramienta para probar consultas y el límite de procesamiento de tu instancia de SQL Server.
Un abrazo y hasta la próxima.