如何减慢SQL查询?

Dav*_*d W 21 sql t-sql sql-server performance sql-server-2008

听起来很奇怪,我需要放慢SQL查询的速度.目前,我在带有AdventureWorks数据库的内部开发服务器上使用Microsoft SQL Server 2008 R2.我正在测试一些代码,无论我尝试什么,我运行的查询都太快了!

基本上我正在测试一个截止功能,需要一个足够长的查询才能在它完成之前切断它.

不幸的是,由于它是本地安装,因此AdventureWorks数据库中没有单个查询或足够大的表来实际为我提供良好的数据.我试过了

WAITFOR DELAY '01:00'
Run Code Online (Sandbox Code Playgroud)

这对于测试以确保它正常工作非常有效,但现在我需要进行测试以确定是否可以在读取中间切断数据流.WAITFOR声明在这方面不公正,因为我需要它来主动从服务器检索数据.我的第一个直觉是使用复杂的计算来减慢速度,但是即使让SQL服务器将查询中的所有数值乘以37次,也只会使查询减慢毫秒.我尝试的第二件事是将WAITFOR语句嵌入到子查询中,但看起来你不能这样做.最后,我唯一没有尝试的是WAITFOR在它们之间执行多个存储过程,但我认为这不会对我需要的东西起作用.

我不得不说,当你接近服务器的时候,我对打一个绝对可怕的查询有多么难以接受.

有什么方法可以轻松减慢查询速度吗?

谢谢!

MS.*_*MS. 36

只需加载一些交叉连接.

SELECT T1.*
FROM SomeTable T1,  
     SomeTable T2,  
     SomeTable T3,  
     SomeTable T4
Run Code Online (Sandbox Code Playgroud)

对于1000行表,将产生1,000亿行,这应该足够慢.

  • 事实是,这两种解决方案(你的和kevins)都很有效.这个瓶子里的I/O并导致我的程序也抛出一些例外(甚至更好!).所以它有助于从我的代码中剔除一些错误.它在30秒内产生了接近2,000,000行,这太棒了哈哈.如果我可以奖励你们两个积分,但我最终会使用这个解决方案,所以我会给你支票. (2认同)

Kev*_*mey 16

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

WHILE @EndTime > GETDATE()
    SELECT 'Test Result'; -- Add your desired query here
Run Code Online (Sandbox Code Playgroud)

编辑

使用递归的另一个选项:

创建一个UDF包装器,GETDATE()以便为结果中的每一行计算新的日期值:

CREATE FUNCTION dbo.GetExactDate()
RETURNS DATETIME    
AS
BEGIN
    RETURN GETDATE();
END
Run Code Online (Sandbox Code Playgroud)

然后使用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);
Run Code Online (Sandbox Code Playgroud)

这样做的好处是可以在一个查询中返回结果,而不是很多(比如我的第一个解决方案),同时仍然能够设置您希望查询保持返回结果的时间量.