2012-06-30 36 views
20

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

基本上我正在测试一个截断功能,需要足够长的查询才能在完成之前将其关闭。

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

WAITFOR DELAY '01:00' 

这真是棒极了,只是测试,以确保它是工作,但现在我需要测试,看看我是否可以削减数据流断中期阅读。 WAITFOR声明在这方面并不公平,因为我需要它积极地从服务器中检索数据。我的第一个直觉是使用复杂的计算来减慢它的速度,但是即使SQL服务器将查询中的所有数值乘以37次,也只会使查询速度减慢毫秒。我尝试的第二件事是在子查询中嵌入WAITFOR语句,但看起来你不能那样做。最后,我还没有尝试过的唯一方法是在它们之间执行多个存储过程和WAITFOR,但我不认为这适用于我所需要的。

我不得不说,当你接近服务器时,要做出绝对可怕的查询是多么困难,我留下了深刻的印象。

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

谢谢!

+3

只是做一个非常糟糕的查询关闭索引或强制通常良好的查询使用LOOP JOIN时,它应该使用HASH/MERGE ;-) – 2012-06-30 19:23:02

+2

几个自交叉连接将很好地放慢速度......而一个大的结果集会导致IO成为瓶颈。 – Oded

回答

26

只要做一个交叉连接的负载。

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

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

+2

事实是,两种解决方案(你的和凯文)都很好。这一个瓶颈I/O并导致我的程序也抛出一些例外(甚至更好!)。所以它帮助我从代码中剔除一些错误。它在30秒内产生了近200万行,这是很好的哈哈。如果我可以奖励你的观点,但我最终会使用这个解决方案,所以我会给你支票。 –

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 

编辑使用递归

另一种选择:

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); 

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