23

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

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

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

WAITFOR DELAY '01:00'

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

我不得不说,当你离服务器这么近时,做出一个绝对糟糕的查询是多么困难,这给我留下了深刻的印象。

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

谢谢!

4

3 回答 3

42

只需进行大量交叉连接即可。

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

对于一个 1000 行的表,它将生成 10000 亿行,这应该足够慢。

于 2012-06-30T19:23:49.373 回答
19
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);

这具有在一个查询中返回结果的优势,而不是很多(就像我的第一个解决方案),同时仍然能够设置您希望查询继续返回结果的时间量。

于 2012-06-30T19:32:24.350 回答
1

在 SQL Server 2016 上测试:(SQL View 查询总是需要两秒钟才能回复)

/* Call WAITFOR DELAY inside SQL View */
/* Usefull for example for async testing */
CREATE FUNCTION WaitForDelay()
RETURNS INT
AS
BEGIN
  RETURN (
    SELECT Value FROM OPENROWSET (
    'SQLOLEDB', 'Trusted_Connection=yes;  Integrated Security=SSPI; Server=localhost; Initial_Catalog=master;',
    'WAITFOR DELAY ''00:00:02'' SELECT 0 AS Value'
  ))
END

GO
CREATE VIEW Wait AS
SELECT dbo.WaitForDelay() AS Value

GO
SELECT * FROM Wait /* Takes sql view 2 seconds to respond */

显示 Management Studio 执行简单视图故意减慢到 2 秒:

https://i.stack.imgur.com/fE60u.png

于 2018-08-10T15:37:16.987 回答