听起来很奇怪我需要放慢SQL查询的速度。目前,我在具有AdventureWorks数据库的内部开发服务器上使用Microsoft SQL Server 2008 R2。我在测试一些代码的过程中,无论我尝试什么,我运行的查询都太快了!
基本上我正在测试一个截止功能,需要一个足够长的查询才能在完成之前切断它。
不幸的是,由于它是本地安装,因此AdventureWorks数据库中没有单个查询或足够大的表来实际为我提供良好的数据。我试过了
WAITFOR DELAY '01:00'
测试确保它正常工作非常有用,但现在我需要测试一下,看看我是否可以在读取中间切断数据流。在这方面,WAITFOR声明并不公平,因为我需要它来主动从服务器检索数据。我的第一个直觉是使用复杂的计算来减慢速度,但是即使让SQL服务器将查询中的所有数值乘以37次,也只会使查询减慢毫秒。我尝试的第二件事是将WAITFOR
语句嵌入到子查询中,但看起来你不能这样做。最后,我唯一没有尝试的是在它们之间执行多个存储过程和WAITFOR
,但我认为这不会对我需要的东西起作用。
我不得不说,当您接近服务器时,我会对制作绝对可怕的查询感到印象深刻。
有什么办法可以轻松减慢查询速度吗?
谢谢!
答案 0 :(得分:33)
只需加载一些交叉连接。
SELECT T1.*
FROM SomeTable T1,
SomeTable T2,
SomeTable T3,
SomeTable T4
对于1000行表,它将产生1,000亿行,这应该足够慢。
答案 1 :(得分:15)
DECLARE @EndTime DATETIME;
SET @EndTime = DATEADD(s, 5, GETDATE()); -- Set your delay here
WHILE @EndTime > GETDATE()
SELECT 'Test Result'; -- Add your desired query here
修改强>
使用递归的另一个选项:
为GETDATE()
创建一个UDF包装器,以便为结果中的每一行计算新的日期值:
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);
这样做的好处是可以在一个查询中返回结果,而不是很多(比如我的第一个解决方案),同时仍然能够设置您希望查询保持返回结果的时间量。
答案 2 :(得分:0)
在SQL Server 2016上进行了测试:(SQL View查询始终只需要两秒钟即可回复)
scala> df.queryExecution.withCachedData
显示Management Studio故意将执行简单视图的速度降低到2秒: