23

奇妙に聞こえるかもしれませんが、SQL クエリを遅くする必要があります。現在、AdventureWorks データベースを備えた社内開発サーバーで Microsoft SQL Server 2008 R2 を使用しています。私はいくつかのコードをテストしている最中であり、実行中のクエリは何を試しても速すぎます!

基本的に、カットオフ機能をテストしており、完了する前にカットオフできるように十分に長いクエリが必要です。

残念ながら、これはローカル インストールであるため、AdventureWorks データベースには単一のクエリや十分な大きさのテーブルがなく、実際に作業するのに適切なデータが得られません。私はもう試した

WAITFOR DELAY '01:00'

これは、機能していることを確認するためにテストするだけでうまくいきましたが、今度は、読み取りの途中でデータ ストリームを切断できるかどうかをテストする必要があります。WAITFOR ステートメントは、サーバーから積極的にデータを取得する必要があるため、その点では適切ではありません。私の最初の直感は、複雑な計算を使用して速度を落とすことでしたが、SQL サーバーでクエリ内のすべての数値を 37 倍しても、クエリの速度はミリ秒単位で低下するだけでした。私が試した2番目のことは、WAITFORステートメントをサブクエリに埋め込むことでしたが、それはできないようです。最後に、私が試したことのない唯一のことは、複数のストアド プロシージャをWAITFORそれらの間で実行することですが、それは私が必要としているものにはうまくいかないと思います。

言わざるを得ないのですが、サーバーにこれほど近い場所にいるときに、まったくひどいクエリを作成するのがいかに難しいかということに感銘を受けました。

クエリを簡単に遅くする方法はありますか?

ありがとうございました!

4

3 に答える 3

42

クロス結合を大量に実行するだけです。

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

1,000 億行を生成する 1,000 行のテーブルの場合、十分に遅いはずです。

于 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

編集

再帰を使用する別のオプション:

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

これには、(私の最初のソリューションのように) 1 つのクエリで結果を返すという利点がありますが、クエリが結果を返し続ける時間を設定することもできます。

于 2012-06-30T19:32:24.350 に答える