2012-06-30 15 views
20

Por extraño que parezca, necesito ralentizar una consulta SQL. Actualmente estoy usando Microsoft SQL Server 2008 R2 en un servidor de desarrollo interno con la base de datos AdventureWorks. Estoy en el proceso de probar algunos códigos y las consultas que estoy ejecutando son demasiado rápidas sin importar lo que intente.Cómo ralentizar una consulta SQL?

Básicamente estoy probando una característica de corte y necesito una consulta lo suficientemente larga para poder cortarla antes de que se complete.

Desafortunadamente, como es una instalación local, no hay una sola consulta o una tabla lo suficientemente grande en la base de datos de AdventureWorks para realmente darme buenos datos para trabajar. He intentado

WAITFOR DELAY '01:00' 

Qué funcionó muy bien para probar simplemente para asegurarse de que estaba trabajando, pero ahora tengo que probar para ver si puedo cortar transmitir los datos a mitad de leer. La declaración de WAITFOR no me hace justicia en ese sentido porque necesito que esté recuperando datos del servidor de forma activa. Mi primera intuición fue utilizar cálculos enrevesados ​​para ralentizarla; sin embargo, incluso si SQL Server multiplicó por sí solo todos los valores numéricos en la consulta, 37 veces solo ralentizó la consulta en milisegundos. Lo segundo que probé fue incrustar la declaración WAITFOR en una sub consulta, pero parece que no puedes hacer eso. Finalmente, lo único que no he intentado es ejecutar varios procedimientos almacenados y WAITFOR entre ellos, pero no creo que funcione para lo que necesito.

Tengo que decir que estoy impresionado por lo difícil que es hacer una consulta absolutamente terrible cuando estás tan cerca del servidor.

¿Hay alguna manera de ralentizar una consulta fácilmente?

¡Gracias!

+3

Simplemente haga una consulta * muy mala * fuera del índice o fuerce una consulta normalmente buena para usar LOOP JOINs cuando debería estar usando HASH/MERGE ;-) –

+2

Unas autocomisiones cruzadas ralentizarán las cosas muy bien ... Y un gran conjunto de resultados causaría que IO fuera el cuello de botella. – Oded

Respuesta

26

Simplemente haga una carga de uniones cruzadas.

SELECT T1.* 
FROM SomeTable T1, 
    SomeTable T2, 
    SomeTable T3, 
    SomeTable T4 

Para una mesa de 1.000 filas que generará 1.000 millones de filas que deben ser lo suficientemente lentas.

+2

La verdad es que ambas soluciones (la suya y la de Kevins) funcionaron muy bien. Este embotelló la E/S Y causó que mi programa arrojara algunas excepciones también (¡incluso mejor!). Así que ayudó a sacar algunos errores de mi código. Se generaron cerca de 2.000.000 filas en menos de 30 segundos, que fue GRANDE jaja.Si pudiera otorgarles los dos puntos, lo haría, pero terminé usando esta solución, así que le daré el cheque. –

14
DECLARE @EndTime DATETIME; 
SET @EndTime = DATEADD(s, 5, GETDATE()); -- Set your delay here 

WHILE @EndTime > GETDATE() 
    SELECT 'Test Result'; -- Add your desired query here 

EDITAR

Otra opción utilizando la recursividad:

Crear un envoltorio UDF para GETDATE() de manera que un nuevo valor de fecha se calculará para cada fila en el resultado:

CREATE FUNCTION dbo.GetExactDate() 
RETURNS DATETIME  
AS 
BEGIN 
    RETURN GETDATE(); 
END 

y luego usar una cte

DECLARE @EndTime DATETIME; 
SET @EndTime = DATEADD(s, 5, GETDATE()); -- Set your delay here 

WITH cte AS (
    SELECT dbo.GetExactDate() Value 
    UNION ALL 
    SELECT dbo.GetExactDate() 
    FROM cte 
    WHERE Value < @EndTime 
) 
SELECT Value 
FROM cte 
OPTION (MAXRECURSION 0); 

Esto tiene la ventaja de devolver los resultados en una consulta, no muchos (como mi primera solución) sin dejar de establecer la cantidad de tiempo durante el cual desea que la consulta siga arrojando resultados.

Cuestiones relacionadas