Articles

Cómo Hacer Que SQL Server Actúe Como Un Ser Humano Utilizando WAITFOR

fischer-twins-396836 Foto de Fischer Twins en Unsplash

Probablemente afine sus consultas para obtener el máximo rendimiento. Se enorgullece de saber cómo agregar índices y código de refactor para aprovechar hasta la última gota del potencial de rendimiento de su servidor. La velocidad suele ser el rey.

Es por eso que probablemente no use el comando WAITFOR de SQL Server regularmente, en realidad hace que su consulta general se ejecute más lenta .

Sin embargo, la lentitud no siempre es algo malo. Hoy quiero mostrarles dos de mis formas favoritas de usar el comando WAITFOR.

Ver el vídeo de esta semana en YouTube

También puedes ver el contenido de esta semana en mi canal de YouTube .

1. Construir un humano

Las computadoras modernas son rápidas. Las CPU realizan miles de millones de acciones por segundo, la cantidad de RAM que los fabricantes pueden acumular en un stick aumenta regularmente, y las SSD están convirtiendo rápidamente las preocupaciones de E/S de disco en una cosa del pasado.

Si bien todas esas cosas son excelentes para procesar grandes cargas de trabajo, mueven las computadoras cada vez más lejos de la «velocidad humana».

Pero «velocidad humana» es a veces lo que quieres. Tal vez desee simular el uso de la aplicación en su base de datos o la carga creada por los analistas que ejecutan consultas ad hoc en su servidor.

Aquí es donde me encanta usar WAITFOR DELAY: puede simular a los humanos ejecutando consultas extremadamente bienl:

-- Run foreverWHILE (1=1)BEGIN --Insert data to simulate an app action from our app EXEC dbo.BuyDonuts 12 -- We usually average an order every 3 seconds WAITFOR DELAY '00:00:03'END

Agregue algunas instrucciones psuedo – generación de números aleatorios y algunas instrucciones IF, y tendrá una carga de servidor falsa que puede comenzar a usar:

WHILE (1=1)BEGIN -- Generate command values 1-24 DECLARE @RandomDonutAmount int = ABS(CHECKSUM(NEWID()) % 25) + 1 -- Generate a delay between 0 and 5 seconds DECLARE @RandomDelay int = ABS(CHECKSUM(NEWID()) % 6) EXEC dbo.BuyDonuts @RandomDonutAmount WAITFOR DELAY @RandomDelayEND

2. El agente de servicios de Poor Man

El agente de servicios es una gran característica de SQL Server. Maneja los escenarios de mensajería y colas muy bien, pero requiere más tiempo de configuración, por lo que generalmente no me gusta usarlo en escenarios donde necesito algo rápido y sucio.

En lugar de tener que configurar el Agente de servicio para saber cuándo hay algunos datos disponibles o un proceso está listo para iniciarse, puedo hacer lo mismo con un bucle WHILE y una ESPERA:

DECLARE @Quantity smallint = NULL-- Keep checking our table data until we find the data we wantWHILE (@Quantity IS NULL)BEGIN -- Delay each iteration of our loop for 10 seconds WAITFOR DELAY '00:00:03' -- Check to see if someone has bought a dozen donuts yet SELECT @Quantity = Quantity FROM dbo.Orders WHERE Quantity = 12END-- Run some other query now that our dozen donut purchase condition has been metEXEC dbo.GenerateCoupon

¿Fantasía? No. Práctico? Sí.

Ya no necesito seguir revisando los resultados de una tabla antes de ejecutar una consulta, puedo hacer que WAITFOR lo haga por mí.

Si sabe que hay un momento específico que desea esperar hasta que comience a hacer ping a algún proceso, puede incorporar TIEMPO DE ESPERA para que su comprobación sea aún más inteligente:

DECLARE @Quantity smallint = NULL-- Let's not start checking until 6am...that's when the donut shop opensWAITFOR TIME '06:00:00'-- Keep checking our table data until we find the data we wantWHILE (@Quantity IS NULL)BEGIN -- Delay each iteration of our loop for 10 seconds WAITFOR DELAY '00:00:03' -- Check to see if someone has bought a dozen donuts yet SELECT @Quantity = Quantity FROM dbo.Orders WHERE Quantity = 12END-- Run some other query now that our dozen donut purchase condition has been metEXEC dbo.GenerateCoupon

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *