2012-06-30 8 views
20

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

基本的に私はカットオフフィーチャをテストしており、完了する前に切り取ることができるように十分に長いクエリが必要です。

残念ながら、ローカルインストールであるため、AdventureWorksデータベースには実際に私に適切なデータを提供するための単一のクエリまたは十分なテーブルはありません。私はちょうどそれが働いていたことを確認するためにテストして素晴らしい仕事

WAITFOR DELAY '01:00' 

を試してみたが、今私は、データが半ばを読みオフストリーミング切ることができるかどうかをテストする必要があります。 WAITFORステートメントは、サーバーからデータを戻して積極的に取得する必要があるため、その点で私に正義を与えません。私の最初の直感は、複雑な計算を使用して速度を落とすことでしたが、SQLサーバーでクエリのすべての数値に37を掛けても、クエリがミリ秒単位で遅くなりました。私が試した第二の事は、サブクエリに WAITFORステートメントを埋め込むことでしたが、それはできません。最後に、私が試していない唯一のことは、複数のストアドプロシージャとその間に WAITFORを実行することですが、私が必要とするものに対してはうまくいかないと思います。

私は、あなたがサーバーに近づいているときに非常にひどいクエリを作成することがどれほど難しいかに感心しました。

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

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

+3

ハッシュ/マージ;-)を使用する必要があるときにLOOP JOINを使用するように、通常オフラインのインデックスを強制的に*悪い*クエリを作成します。 –

+2

いくつかの自己クロスジョインは、結果セットが大きければ、IOがボトルネックになります。 – Oded

答えて

26

クロスジョインの負荷をかけてください。

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

1000ローのテーブルを作成するには十分な速度が十分にあるはずです。

+2

真実は両方のソリューション(あなたとケビン)がうまくいったことです。この1つがI/Oをボトルネックにして、プログラムにいくつかの例外を投げかけました(さらに良い!)。だから私のコードからいくつかのバグを取り除くことができました。これは30秒未満で2,000,000行に近くなった。もし私があなたの両方のポイントを授与することができれば、私はこのソリューションを使用することになったので、私はあなたにチェックをします。 –

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 

EDIT

再帰を使用して別のオプション:

新しい日付の値は、結果の各行について計算されるようGETDATE()ためのUDFラッパーを作成します。

CREATE FUNCTION dbo.GetExactDate() 
RETURNS DATETIME  
AS 
BEGIN 
    RETURN GETDATE(); 
END 

を使用してから

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つのクエリで結果を返すというメリットがあります(最初のソリューションと同じように)。結果を返すようにクエリを継続する時間を設定できます。

関連する問題