Подтвердить что ты не робот

Как замедлить SQL-запрос?

Как ни странно, мне нужно замедлить SQL-запрос. В настоящее время я использую Microsoft SQL Server 2008 R2 на собственном сервере разработки с базой данных AdventureWorks. Я тестирую код, и запросы, которые я запускаю, слишком быстры, независимо от того, что я пытаюсь сделать.

В основном я тестирую функцию отсечки и нуждаюсь в достаточно длинном запросе, чтобы иметь возможность отключить его, прежде чем он завершится.

К сожалению, поскольку это локальная установка, в базе данных AdventureWorks нет ни одного запроса, ни достаточно большой таблицы, чтобы на самом деле дать мне хорошие данные для работы. Я пробовал

WAITFOR DELAY '01:00'

Который работал отлично, чтобы просто проверить, чтобы убедиться, что он работает, но теперь мне нужно проверить, могу ли я сократить поток данных с середины чтения. Заявление WAITFOR не дает мне справедливости в этом отношении, потому что мне нужно, чтобы он активно возвращал данные с сервера. Моя первая интуиция заключалась в том, чтобы использовать свернутые вычисления, чтобы замедлить ее работу, однако даже когда SQL Server умножает все числовые значения в запросе сами по себе, 37 раз только замедлял запрос на миллисекунды. Вторая вещь, которую я пробовал, - это встраивание оператора WAITFOR в подзапрос, но, похоже, вы не можете этого сделать. Наконец, единственное, что я не пробовал, - это выполнить несколько хранимых процедур и WAITFOR между ними, но я не думаю, что это сработало бы для того, что мне нужно.

Я должен сказать, что я впечатлен тем, насколько сложно сделать абсолютно ужасный запрос, когда вы близко к серверу.

Можно ли легко замедлить запрос?

Спасибо!

4b9b3361

Ответ 1

Просто загрузите крест-соединения.

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

Для таблицы 1000 строк, которая будет генерировать 1000 миллиардов строк, которые должны быть достаточно медленными.

Ответ 2

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

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

ИЗМЕНИТЬ

Другая опция, использующая рекурсию:

Создайте обертку UDF для GETDATE(), чтобы новое значение даты было рассчитано для каждой строки результата:

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

а затем используйте 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);

Это имеет преимущество, заключающееся в возврате результатов в одном запросе, не так много (например, в моем первом решении), но при этом можно установить время, в течение которого вы хотите, чтобы запрос сохранял результаты.