Как замедлить SQL-запрос?
Как ни странно, мне нужно замедлить SQL-запрос. В настоящее время я использую Microsoft SQL Server 2008 R2 на собственном сервере разработки с базой данных AdventureWorks. Я тестирую код, и запросы, которые я запускаю, слишком быстры, независимо от того, что я пытаюсь сделать.
В основном я тестирую функцию отсечки и нуждаюсь в достаточно длинном запросе, чтобы иметь возможность отключить его, прежде чем он завершится.
К сожалению, поскольку это локальная установка, в базе данных AdventureWorks нет ни одного запроса, ни достаточно большой таблицы, чтобы на самом деле дать мне хорошие данные для работы. Я пробовал
WAITFOR DELAY '01:00'
Который работал отлично, чтобы просто проверить, чтобы убедиться, что он работает, но теперь мне нужно проверить, могу ли я сократить поток данных с середины чтения. Заявление WAITFOR не дает мне справедливости в этом отношении, потому что мне нужно, чтобы он активно возвращал данные с сервера. Моя первая интуиция заключалась в том, чтобы использовать свернутые вычисления, чтобы замедлить ее работу, однако даже когда SQL Server умножает все числовые значения в запросе сами по себе, 37 раз только замедлял запрос на миллисекунды. Вторая вещь, которую я пробовал, - это встраивание оператора WAITFOR
в подзапрос, но, похоже, вы не можете этого сделать. Наконец, единственное, что я не пробовал, - это выполнить несколько хранимых процедур и WAITFOR
между ними, но я не думаю, что это сработало бы для того, что мне нужно.
Я должен сказать, что я впечатлен тем, насколько сложно сделать абсолютно ужасный запрос, когда вы близко к серверу.
Можно ли легко замедлить запрос?
Спасибо!
Ответы
Ответ 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);
Это имеет преимущество, заключающееся в возврате результатов в одном запросе, не так много (например, в моем первом решении), но при этом можно установить время, в течение которого вы хотите, чтобы запрос сохранял результаты.