2012-06-30 16 views
20

Per quanto strano possa sembrare, ho bisogno di rallentare una query SQL. Attualmente sto utilizzando Microsoft SQL Server 2008 R2 su un server di sviluppo interno con il database AdventureWorks. Sono in procinto di testare del codice e le query che sto eseguendo sono troppo veloci, non importa quello che cerco!Come rallentare una query SQL?

Fondamentalmente sto testando una funzione di cut-off e ho bisogno di una query sufficientemente lunga per poterla tagliare prima che venga completata.

Sfortunatamente, poiché è un'installazione locale, non c'è una singola query o una tabella abbastanza grande nel database AdventureWorks per darmi effettivamente dati validi con cui lavorare. Ho provato

WAITFOR DELAY '01:00' 

che ha lavorato molto per testare solo per assicurarsi che stava lavorando, ma ora ho bisogno di testare per vedere se riesco a tagliare i dati di flusso off metà lettura. La dichiarazione WAITFOR non mi rende giustizia a tale riguardo perché ho bisogno di recuperare i dati dal server attivamente. La mia prima intuizione è stata quella di utilizzare calcoli convoluti per rallentarlo, tuttavia anche se il server SQL moltiplicava tutti i valori numerici nella query, 37 volte solo rallentavano la query di millisecondi. La seconda cosa che ho provato è stata incorporare l'istruzione WAITFOR in una sottoquery ma sembra che tu non possa farlo. Infine, l'unica cosa che non ho provato è l'esecuzione di più stored procedure e WAITFOR tra loro, ma non penso che funzionerebbe per quello che mi serve.

Devo dire, sono impressionato da quanto sia difficile fare una query assolutamente terribile quando sei così vicino al server.

C'è un modo per rallentare facilmente una query?

Grazie!

+3

Basta effettuare una query * davvero scadente * off-index o forzare una query normalmente valida per utilizzare LOOP JOINs quando dovrebbe utilizzare HASH/MERGE ;-) –

+2

Alcuni join self-cross rallenteranno le cose bene ... E un ampio set di risultati potrebbe causare il collo di bottiglia di IO. – Oded

risposta

26

Basta fare un carico di cross join.

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

Per una tabella di 1.000 file che genererà 1.000 miliardi di righe che dovrebbero essere abbastanza lente.

+2

La verità è che entrambe le soluzioni (la tua e la kevins) funzionavano alla grande. Questo ha strozzato l'I/O E ha anche causato alcune eccezioni al mio programma (ancora meglio!). Quindi ha aiutato a rimuovere alcuni bug dal mio codice. Ha generato quasi 2.000.000 di file in meno di 30 secondi che è stato GRANDE haha.Se potessi premiare entrambi i punti, lo farei, ma alla fine ho usato questa soluzione per darti il ​​controllo. –

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 

EDIT

Un'altra opzione utilizzando la ricorsione:

Creare un involucro UDF per GETDATE() modo che un nuovo valore di data sarà calcolato per ogni riga del risultato:

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

e quindi utilizzare 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); 

Questo ha il vantaggio di restituire i risultati in una query, non molti (come la mia prima soluzione) pur rimanendo in grado di impostare il tempo per il quale si desidera che la query mantenga i risultati di ritorno.